Return to microtime.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / standard |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 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: microtime.c 321634 2012-01-01 13:15:04Z felipe $ */ ! 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: */