diff options
Diffstat (limited to 'ext/standard/microtime.c')
-rw-r--r-- | ext/standard/microtime.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/ext/standard/microtime.c b/ext/standard/microtime.c new file mode 100644 index 0000000..219e35d --- /dev/null +++ b/ext/standard/microtime.c @@ -0,0 +1,166 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Paul Panotzki - Bunyip Information Systems | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +#include "php.h" + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef PHP_WIN32 +#include "win32/time.h" +#elif defined(NETWARE) +#include <sys/timeval.h> +#include <sys/time.h> +#else +#include <sys/time.h> +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <errno.h> + +#include "microtime.h" +#include "ext/date/php_date.h" + +#define NUL '\0' +#define MICRO_IN_SEC 1000000.00 +#define SEC_IN_MIN 60 + +#ifdef HAVE_GETTIMEOFDAY +static void _php_gettimeofday(INTERNAL_FUNCTION_PARAMETERS, int mode) +{ + zend_bool get_as_float = 0; + struct timeval tp = {0}; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &get_as_float) == FAILURE) { + return; + } + + if (gettimeofday(&tp, NULL)) { + RETURN_FALSE; + } + + if (get_as_float) { + RETURN_DOUBLE((double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC)); + } + + if (mode) { + timelib_time_offset *offset; + + offset = timelib_get_time_zone_info(tp.tv_sec, get_timezone_info(TSRMLS_C)); + + array_init(return_value); + add_assoc_long(return_value, "sec", tp.tv_sec); + add_assoc_long(return_value, "usec", tp.tv_usec); + + add_assoc_long(return_value, "minuteswest", -offset->offset / SEC_IN_MIN); + add_assoc_long(return_value, "dsttime", offset->is_dst); + + timelib_time_offset_dtor(offset); + } else { + char ret[100]; + + snprintf(ret, 100, "%.8F %ld", tp.tv_usec / MICRO_IN_SEC, tp.tv_sec); + RETURN_STRING(ret, 1); + } +} + +/* {{{ proto mixed microtime([bool get_as_float]) + Returns either a string or a float containing the current time in seconds and microseconds */ +PHP_FUNCTION(microtime) +{ + _php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +} +/* }}} */ + +/* {{{ proto array gettimeofday([bool get_as_float]) + Returns the current time as array */ +PHP_FUNCTION(gettimeofday) +{ + _php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +#endif +/* }}} */ + +#ifdef HAVE_GETRUSAGE +/* {{{ proto array getrusage([int who]) + Returns an array of usage statistics */ +PHP_FUNCTION(getrusage) +{ + struct rusage usg; + long pwho = 0; + int who = RUSAGE_SELF; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &pwho) == FAILURE) { + return; + } + + if (pwho == 1) { + who = RUSAGE_CHILDREN; + } + + memset(&usg, 0, sizeof(struct rusage)); + + if (getrusage(who, &usg) == -1) { + RETURN_FALSE; + } + + array_init(return_value); +#define PHP_RUSAGE_PARA(a) \ + add_assoc_long(return_value, #a, usg.a) +#if !defined( _OSD_POSIX) && !defined(__BEOS__) /* BS2000 has only a few fields in the rusage struct */ + PHP_RUSAGE_PARA(ru_oublock); + PHP_RUSAGE_PARA(ru_inblock); + PHP_RUSAGE_PARA(ru_msgsnd); + PHP_RUSAGE_PARA(ru_msgrcv); + PHP_RUSAGE_PARA(ru_maxrss); + PHP_RUSAGE_PARA(ru_ixrss); + PHP_RUSAGE_PARA(ru_idrss); + PHP_RUSAGE_PARA(ru_minflt); + PHP_RUSAGE_PARA(ru_majflt); + PHP_RUSAGE_PARA(ru_nsignals); + PHP_RUSAGE_PARA(ru_nvcsw); + PHP_RUSAGE_PARA(ru_nivcsw); + PHP_RUSAGE_PARA(ru_nswap); +#endif /*_OSD_POSIX*/ + PHP_RUSAGE_PARA(ru_utime.tv_usec); + PHP_RUSAGE_PARA(ru_utime.tv_sec); + PHP_RUSAGE_PARA(ru_stime.tv_usec); + PHP_RUSAGE_PARA(ru_stime.tv_sec); +#undef PHP_RUSAGE_PARA +} +#endif /* HAVE_GETRUSAGE */ + +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 fdm=marker + * vim<600: sw=4 ts=4 + */ |