1 | /* |
2 | +----------------------------------------------------------------------+ |
3 | | PHP Version 5 | |
4 | +----------------------------------------------------------------------+ |
5 | | Copyright (c) 1997-2015 The PHP Group | |
6 | +----------------------------------------------------------------------+ |
7 | | This source file is subject to version 3.01 of the PHP license, | |
8 | | that is bundled with this package in the file LICENSE, and is | |
9 | | available through the world-wide-web at the following url: | |
10 | | http://www.php.net/license/3_01.txt | |
11 | | If you did not receive a copy of the PHP license and are unable to | |
12 | | obtain it through the world-wide-web, please send a note to | |
13 | | license@php.net so we can mail you a copy immediately. | |
14 | +----------------------------------------------------------------------+ |
15 | | Author: Paul Panotzki - Bunyip Information Systems | |
16 | +----------------------------------------------------------------------+ |
17 | */ |
18 | |
19 | /* $Id$ */ |
20 | |
21 | #include "php.h" |
22 | |
23 | #ifdef HAVE_SYS_TYPES_H |
24 | #include <sys/types.h> |
25 | #endif |
26 | #ifdef PHP_WIN32 |
27 | #include "win32/time.h" |
28 | #elif defined(NETWARE) |
29 | #include <sys/timeval.h> |
30 | #include <sys/time.h> |
31 | #else |
32 | #include <sys/time.h> |
33 | #endif |
34 | #ifdef HAVE_SYS_RESOURCE_H |
35 | #include <sys/resource.h> |
36 | #endif |
37 | #ifdef HAVE_UNISTD_H |
38 | #include <unistd.h> |
39 | #endif |
40 | #include <stdlib.h> |
41 | #include <string.h> |
42 | #include <stdio.h> |
43 | #include <errno.h> |
44 | |
45 | #include "microtime.h" |
46 | #include "ext/date/php_date.h" |
47 | |
48 | #define NUL '\0' |
49 | #define MICRO_IN_SEC 1000000.00 |
50 | #define SEC_IN_MIN 60 |
51 | |
52 | #ifdef HAVE_GETTIMEOFDAY |
53 | static void _php_gettimeofday(INTERNAL_FUNCTION_PARAMETERS, int mode) |
54 | { |
55 | zend_bool get_as_float = 0; |
56 | struct timeval tp = {0}; |
57 | |
58 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b" , &get_as_float) == FAILURE) { |
59 | return; |
60 | } |
61 | |
62 | if (gettimeofday(&tp, NULL)) { |
63 | RETURN_FALSE; |
64 | } |
65 | |
66 | if (get_as_float) { |
67 | RETURN_DOUBLE((double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC)); |
68 | } |
69 | |
70 | if (mode) { |
71 | timelib_time_offset *offset; |
72 | |
73 | offset = timelib_get_time_zone_info(tp.tv_sec, get_timezone_info(TSRMLS_C)); |
74 | |
75 | array_init(return_value); |
76 | add_assoc_long(return_value, "sec" , tp.tv_sec); |
77 | add_assoc_long(return_value, "usec" , tp.tv_usec); |
78 | |
79 | add_assoc_long(return_value, "minuteswest" , -offset->offset / SEC_IN_MIN); |
80 | add_assoc_long(return_value, "dsttime" , offset->is_dst); |
81 | |
82 | timelib_time_offset_dtor(offset); |
83 | } else { |
84 | char ret[100]; |
85 | |
86 | snprintf(ret, 100, "%.8F %ld" , tp.tv_usec / MICRO_IN_SEC, tp.tv_sec); |
87 | RETURN_STRING(ret, 1); |
88 | } |
89 | } |
90 | |
91 | /* {{{ proto mixed microtime([bool get_as_float]) |
92 | Returns either a string or a float containing the current time in seconds and microseconds */ |
93 | PHP_FUNCTION(microtime) |
94 | { |
95 | _php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); |
96 | } |
97 | /* }}} */ |
98 | |
99 | /* {{{ proto array gettimeofday([bool get_as_float]) |
100 | Returns the current time as array */ |
101 | PHP_FUNCTION(gettimeofday) |
102 | { |
103 | _php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); |
104 | } |
105 | #endif |
106 | /* }}} */ |
107 | |
108 | #ifdef HAVE_GETRUSAGE |
109 | /* {{{ proto array getrusage([int who]) |
110 | Returns an array of usage statistics */ |
111 | PHP_FUNCTION(getrusage) |
112 | { |
113 | struct rusage usg; |
114 | long pwho = 0; |
115 | int who = RUSAGE_SELF; |
116 | |
117 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l" , &pwho) == FAILURE) { |
118 | return; |
119 | } |
120 | |
121 | if (pwho == 1) { |
122 | who = RUSAGE_CHILDREN; |
123 | } |
124 | |
125 | memset(&usg, 0, sizeof(struct rusage)); |
126 | |
127 | if (getrusage(who, &usg) == -1) { |
128 | RETURN_FALSE; |
129 | } |
130 | |
131 | array_init(return_value); |
132 | #define PHP_RUSAGE_PARA(a) \ |
133 | add_assoc_long(return_value, #a, usg.a) |
134 | #if !defined( _OSD_POSIX) && !defined(__BEOS__) /* BS2000 has only a few fields in the rusage struct */ |
135 | PHP_RUSAGE_PARA(ru_oublock); |
136 | PHP_RUSAGE_PARA(ru_inblock); |
137 | PHP_RUSAGE_PARA(ru_msgsnd); |
138 | PHP_RUSAGE_PARA(ru_msgrcv); |
139 | PHP_RUSAGE_PARA(ru_maxrss); |
140 | PHP_RUSAGE_PARA(ru_ixrss); |
141 | PHP_RUSAGE_PARA(ru_idrss); |
142 | PHP_RUSAGE_PARA(ru_minflt); |
143 | PHP_RUSAGE_PARA(ru_majflt); |
144 | PHP_RUSAGE_PARA(ru_nsignals); |
145 | PHP_RUSAGE_PARA(ru_nvcsw); |
146 | PHP_RUSAGE_PARA(ru_nivcsw); |
147 | PHP_RUSAGE_PARA(ru_nswap); |
148 | #endif /*_OSD_POSIX*/ |
149 | PHP_RUSAGE_PARA(ru_utime.tv_usec); |
150 | PHP_RUSAGE_PARA(ru_utime.tv_sec); |
151 | PHP_RUSAGE_PARA(ru_stime.tv_usec); |
152 | PHP_RUSAGE_PARA(ru_stime.tv_sec); |
153 | #undef PHP_RUSAGE_PARA |
154 | } |
155 | #endif /* HAVE_GETRUSAGE */ |
156 | |
157 | /* }}} */ |
158 | |
159 | /* |
160 | * Local variables: |
161 | * tab-width: 4 |
162 | * c-basic-offset: 4 |
163 | * End: |
164 | * vim600: sw=4 ts=4 fdm=marker |
165 | * vim<600: sw=4 ts=4 |
166 | */ |
167 | |