summaryrefslogtreecommitdiff
path: root/ext/standard/microtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/microtime.c')
-rw-r--r--ext/standard/microtime.c166
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
+ */