From 03fa600c30a33b678fa8290f51bc68b398cfba08 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 24 Jun 2023 16:19:07 +0200 Subject: [PATCH 01/13] Move php_hrtime_current() to zend_monotonic_time() --- UPGRADING.INTERNALS | 3 + Zend/zend.c | 2 + Zend/zend_time.c | 93 +++++++++++++++++++++++ Zend/zend_time.h | 104 ++++++++++++++++++++++++++ configure.ac | 2 + ext/standard/basic_functions.c | 2 - ext/standard/hrtime.c | 131 ++------------------------------- ext/standard/hrtime.h | 56 -------------- ext/standard/php_standard.h | 1 - 9 files changed, 209 insertions(+), 185 deletions(-) create mode 100644 Zend/zend_time.c create mode 100644 Zend/zend_time.h delete mode 100644 ext/standard/hrtime.h diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index b1a9188748fad..76b05ef16680f 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -67,6 +67,9 @@ PHP 8.3 INTERNALS UPGRADE NOTES - zend_set_user_opcode_handler - zend_ssa_inference * Removed unused macros PHP_FNV1_32A_INIT and PHP_FNV1A_64_INIT. See GH-11114. +* Removed ext/standard/hrtime.h, PHP_HRTIME_ macros, HRTIME_AVAILABLE, and + php_hrtime_current(). +* Added Zend/zend_time.h, ZEND_MONOTONIC_TIME_AVAILABLE, zend_monotonic_time() ======================== 2. Build system changes diff --git a/Zend/zend.c b/Zend/zend.c index ee3f5272c9640..461b85479ce90 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -37,6 +37,7 @@ #include "zend_fibers.h" #include "zend_call_stack.h" #include "zend_max_execution_timer.h" +#include "zend_time.h" #include "Optimizer/zend_optimizer.h" static size_t global_map_ptr_last = 0; @@ -899,6 +900,7 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */ fpsetmask(0); #endif + zend_startup_time(); zend_startup_strtod(); zend_startup_extensions_mechanism(); diff --git a/Zend/zend_time.c b/Zend/zend_time.c new file mode 100644 index 0000000000000..92bf56e8e2fdb --- /dev/null +++ b/Zend/zend_time.c @@ -0,0 +1,93 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) 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: | + | https://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: Niklas Keller | + | Author: Anatol Belski | + +----------------------------------------------------------------------+ + */ + +#include "zend.h" +#include "zend_time.h" + +/* This file reuses code parts from the cross-platform timer library + Public Domain - 2011 Mattias Jansson / Rampant Pixels */ + +#if ZEND_TIME_PLATFORM_POSIX + +# include +# include +# include + +#elif ZEND_TIME_PLATFORM_WINDOWS + +# define WIN32_LEAN_AND_MEAN + +double zend_timer_scale = .0; + +#elif ZEND_TIME_PLATFORM_APPLE + +# include +# include +mach_timebase_info_data_t zend_timerlib_info; + +#elif ZEND_TIME_PLATFORM_HPUX + +# include + +#elif ZEND_TIME_PLATFORM_AIX + +# include +# include + +#endif + +zend_result zend_startup_time(void) +{ +#if ZEND_TIME_PLATFORM_WINDOWS + + LARGE_INTEGER tf = {0}; + if (!QueryPerformanceFrequency(&tf) || 0 == tf.QuadPart) { + return FAILURE; + } + zend_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_time_t)tf.QuadPart; + +#elif ZEND_TIME_PLATFORM_APPLE + + if (mach_timebase_info(&zend_timerlib_info)) { + return FAILURE; + } + +#elif ZEND_TIME_PLATFORM_POSIX + +#if !_POSIX_MONOTONIC_CLOCK +#ifdef _SC_MONOTONIC_CLOCK + if (0 >= sysconf(_SC_MONOTONIC_CLOCK)) { + return FAILURE; + } +#endif +#endif + +#elif ZEND_TIME_PLATFORM_HPUX + + /* pass */ + +#elif ZEND_TIME_PLATFORM_AIX + + /* pass */ + +#else + /* Timer unavailable. */ +# error "Monotonic timer unavailable" +#endif + + return SUCCESS; +} diff --git a/Zend/zend_time.h b/Zend/zend_time.h new file mode 100644 index 0000000000000..f18078bbe6dc1 --- /dev/null +++ b/Zend/zend_time.h @@ -0,0 +1,104 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) 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: | + | https://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: Niklas Keller | + | Author: Anatol Belski | + +----------------------------------------------------------------------+ +*/ + +#ifndef ZEND_TIME_H +#define ZEND_TIME_H + +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_TIME_H +# include +#endif + +#define ZEND_TIME_PLATFORM_POSIX 0 +#define ZEND_TIME_PLATFORM_WINDOWS 0 +#define ZEND_TIME_PLATFORM_APPLE 0 +#define ZEND_TIME_PLATFORM_HPUX 0 +#define ZEND_TIME_PLATFORM_AIX 0 + +#if defined(_POSIX_TIMERS) && ((_POSIX_TIMERS > 0) || defined(__OpenBSD__)) && defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC) +# undef ZEND_TIME_PLATFORM_POSIX +# define ZEND_TIME_PLATFORM_POSIX 1 +#elif defined(_WIN32) || defined(_WIN64) +# undef ZEND_TIME_PLATFORM_WINDOWS +# define ZEND_TIME_PLATFORM_WINDOWS 1 +#elif defined(__APPLE__) +# undef ZEND_TIME_PLATFORM_APPLE +# define ZEND_TIME_PLATFORM_APPLE 1 +#elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__))) +# undef ZEND_TIME_PLATFORM_HPUX +# define ZEND_TIME_PLATFORM_HPUX 1 +#elif defined(_AIX) +# undef ZEND_TIME_PLATFORM_AIX +# define ZEND_TIME_PLATFORM_AIX 1 +#endif + +#define ZEND_MONOTONIC_TIME_AVAILABLE (ZEND_TIME_PLATFORM_POSIX || ZEND_TIME_PLATFORM_WINDOWS || ZEND_TIME_PLATFORM_APPLE || ZEND_TIME_PLATFORM_HPUX || ZEND_TIME_PLATFORM_AIX) + +#include "zend_portability.h" +#include "zend_types.h" + +BEGIN_EXTERN_C() + +#if ZEND_TIME_PLATFORM_WINDOWS + +extern double zend_timer_scale = .0; + +#elif ZEND_TIME_PLATFORM_APPLE + +# include +# include +extern mach_timebase_info_data_t zend_timerlib_info; + +#endif + +#define ZEND_NANO_IN_SEC 1000000000 + +typedef uint64_t zend_time_t; + +zend_result zend_startup_time(void); + +static zend_always_inline zend_time_t zend_monotonic_time(void) +{ +#if ZEND_TIME_PLATFORM_WINDOWS + LARGE_INTEGER lt = {0}; + QueryPerformanceCounter(<); + return (zend_time_t)((zend_time_t)lt.QuadPart * zend_timer_scale); +#elif ZEND_TIME_PLATFORM_APPLE + return (zend_time_t)mach_absolute_time() * zend_timerlib_info.numer / zend_timerlib_info.denom; +#elif ZEND_TIME_PLATFORM_POSIX + struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; + if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) { + return ((zend_time_t) ts.tv_sec * (zend_time_t)ZEND_NANO_IN_SEC) + ts.tv_nsec; + } + return 0; +#elif ZEND_TIME_PLATFORM_HPUX + return (zend_time_t) gethrtime(); +#elif ZEND_TIME_PLATFORM_AIX + timebasestruct_t t; + read_wall_time(&t, TIMEBASE_SZ); + time_base_to_time(&t, TIMEBASE_SZ); + return (zend_time_t) t.tb_high * (zend_time_t)NANO_IN_SEC + t.tb_low; +#else + return 0; +#endif +} + +END_EXTERN_C() + +#endif /* ZEND_TIME_H */ diff --git a/configure.ac b/configure.ac index 0a475ed80f311..8503942412500 100644 --- a/configure.ac +++ b/configure.ac @@ -396,6 +396,7 @@ dirent.h \ sys/param.h \ sys/types.h \ sys/time.h \ +time.h \ netinet/in.h \ alloca.h \ arpa/inet.h \ @@ -1734,6 +1735,7 @@ PHP_ADD_SOURCES(Zend, \ zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_gdb.c \ zend_observer.c zend_system_id.c zend_enum.c zend_fibers.c zend_atomic.c \ zend_max_execution_timer.c \ + zend_time.c \ Optimizer/zend_optimizer.c \ Optimizer/pass1.c \ Optimizer/pass3.c \ diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 1c84ddcc98947..60d484341a0aa 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -352,8 +352,6 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ php_register_url_stream_wrapper("http", &php_stream_http_wrapper); php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); - BASIC_MINIT_SUBMODULE(hrtime) - return SUCCESS; } /* }}} */ diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c index 7dca135c920aa..4f3f9fe2e577c 100644 --- a/ext/standard/hrtime.c +++ b/ext/standard/hrtime.c @@ -16,123 +16,7 @@ */ #include "php.h" -#include "hrtime.h" - -/* {{{ */ -/* This file reuses code parts from the cross-platform timer library - Public Domain - 2011 Mattias Jansson / Rampant Pixels */ - -#if PHP_HRTIME_PLATFORM_POSIX - -# include -# include -# include - -#elif PHP_HRTIME_PLATFORM_WINDOWS - -# define WIN32_LEAN_AND_MEAN - -static double _timer_scale = .0; - -#elif PHP_HRTIME_PLATFORM_APPLE - -# include -# include -static mach_timebase_info_data_t _timerlib_info; - -#elif PHP_HRTIME_PLATFORM_HPUX - -# include - -#elif PHP_HRTIME_PLATFORM_AIX - -# include -# include - -#endif - -#define NANO_IN_SEC 1000000000 -/* }}} */ - -static int _timer_init(void) -{/*{{{*/ -#if PHP_HRTIME_PLATFORM_WINDOWS - - LARGE_INTEGER tf = {0}; - if (!QueryPerformanceFrequency(&tf) || 0 == tf.QuadPart) { - return -1; - } - _timer_scale = (double)NANO_IN_SEC / (php_hrtime_t)tf.QuadPart; - -#elif PHP_HRTIME_PLATFORM_APPLE - - if (mach_timebase_info(&_timerlib_info)) { - return -1; - } - -#elif PHP_HRTIME_PLATFORM_POSIX - -#if !_POSIX_MONOTONIC_CLOCK -#ifdef _SC_MONOTONIC_CLOCK - if (0 >= sysconf(_SC_MONOTONIC_CLOCK)) { - return -1; - } -#endif -#endif - -#elif PHP_HRTIME_PLATFORM_HPUX - - /* pass */ - -#elif PHP_HRTIME_PLATFORM_AIX - - /* pass */ - -#else - /* Timer unavailable. */ - return -1; -#endif - - return 0; -}/*}}}*/ - -/* {{{ */ -PHP_MINIT_FUNCTION(hrtime) -{ - if (0 > _timer_init()) { - php_error_docref(NULL, E_WARNING, "Failed to initialize high-resolution timer"); - return FAILURE; - } - - return SUCCESS; -} -/* }}} */ - -static zend_always_inline php_hrtime_t _timer_current(void) -{/*{{{*/ -#if PHP_HRTIME_PLATFORM_WINDOWS - LARGE_INTEGER lt = {0}; - QueryPerformanceCounter(<); - return (php_hrtime_t)((php_hrtime_t)lt.QuadPart * _timer_scale); -#elif PHP_HRTIME_PLATFORM_APPLE - return (php_hrtime_t)mach_absolute_time() * _timerlib_info.numer / _timerlib_info.denom; -#elif PHP_HRTIME_PLATFORM_POSIX - struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; - if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) { - return ((php_hrtime_t) ts.tv_sec * (php_hrtime_t)NANO_IN_SEC) + ts.tv_nsec; - } - return 0; -#elif PHP_HRTIME_PLATFORM_HPUX - return (php_hrtime_t) gethrtime(); -#elif PHP_HRTIME_PLATFORM_AIX - timebasestruct_t t; - read_wall_time(&t, TIMEBASE_SZ); - time_base_to_time(&t, TIMEBASE_SZ); - return (php_hrtime_t) t.tb_high * (php_hrtime_t)NANO_IN_SEC + t.tb_low; -#else - return 0; -#endif -}/*}}}*/ +#include "zend_time.h" #ifdef ZEND_ENABLE_ZVAL_LONG64 #define PHP_RETURN_HRTIME(t) RETURN_LONG((zend_long)t) @@ -162,9 +46,9 @@ static zend_always_inline php_hrtime_t _timer_current(void) delivered timestamp is monotonic and cannot be adjusted. */ PHP_FUNCTION(hrtime) { -#if HRTIME_AVAILABLE +#if ZEND_MONOTONIC_TIME_AVAILABLE bool get_as_num = 0; - php_hrtime_t t = _timer_current(); + zend_time_t t = zend_monotonic_time(); ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL @@ -176,16 +60,11 @@ PHP_FUNCTION(hrtime) } else { array_init_size(return_value, 2); zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); - add_next_index_long(return_value, (zend_long)(t / (php_hrtime_t)NANO_IN_SEC)); - add_next_index_long(return_value, (zend_long)(t % (php_hrtime_t)NANO_IN_SEC)); + add_next_index_long(return_value, (zend_long)(t / (zend_time_t)ZEND_NANO_IN_SEC)); + add_next_index_long(return_value, (zend_long)(t % (zend_time_t)ZEND_NANO_IN_SEC)); } #else RETURN_FALSE; #endif } /* }}} */ - -PHPAPI php_hrtime_t php_hrtime_current(void) -{/*{{{*/ - return _timer_current(); -}/*}}}*/ diff --git a/ext/standard/hrtime.h b/ext/standard/hrtime.h deleted file mode 100644 index 0aa39f0ac3735..0000000000000 --- a/ext/standard/hrtime.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Copyright (c) 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: | - | https://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: Niklas Keller | - | Author: Anatol Belski | - +----------------------------------------------------------------------+ -*/ - -#ifndef HRTIME_H -#define HRTIME_H - -#define PHP_HRTIME_PLATFORM_POSIX 0 -#define PHP_HRTIME_PLATFORM_WINDOWS 0 -#define PHP_HRTIME_PLATFORM_APPLE 0 -#define PHP_HRTIME_PLATFORM_HPUX 0 -#define PHP_HRTIME_PLATFORM_AIX 0 - -#if defined(_POSIX_TIMERS) && ((_POSIX_TIMERS > 0) || defined(__OpenBSD__)) && defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC) -# undef PHP_HRTIME_PLATFORM_POSIX -# define PHP_HRTIME_PLATFORM_POSIX 1 -#elif defined(_WIN32) || defined(_WIN64) -# undef PHP_HRTIME_PLATFORM_WINDOWS -# define PHP_HRTIME_PLATFORM_WINDOWS 1 -#elif defined(__APPLE__) -# undef PHP_HRTIME_PLATFORM_APPLE -# define PHP_HRTIME_PLATFORM_APPLE 1 -#elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__))) -# undef PHP_HRTIME_PLATFORM_HPUX -# define PHP_HRTIME_PLATFORM_HPUX 1 -#elif defined(_AIX) -# undef PHP_HRTIME_PLATFORM_AIX -# define PHP_HRTIME_PLATFORM_AIX 1 -#endif - -#define HRTIME_AVAILABLE (PHP_HRTIME_PLATFORM_POSIX || PHP_HRTIME_PLATFORM_WINDOWS || PHP_HRTIME_PLATFORM_APPLE || PHP_HRTIME_PLATFORM_HPUX || PHP_HRTIME_PLATFORM_AIX) - -BEGIN_EXTERN_C() - -typedef uint64_t php_hrtime_t; - -PHPAPI php_hrtime_t php_hrtime_current(void); - -PHP_MINIT_FUNCTION(hrtime); - -END_EXTERN_C() - -#endif /* HRTIME_H */ diff --git a/ext/standard/php_standard.h b/ext/standard/php_standard.h index 5db7ebf38f057..5bf41431eeabb 100644 --- a/ext/standard/php_standard.h +++ b/ext/standard/php_standard.h @@ -23,7 +23,6 @@ #include "php_mail.h" #include "md5.h" #include "sha1.h" -#include "hrtime.h" #include "html.h" #include "exec.h" #include "file.h" From 01653bf06bbf7db33fcd12bfbf1fa0f71fe8ff74 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 24 Jun 2023 16:28:03 +0200 Subject: [PATCH 02/13] Expose time spend collecting cycles in gc_status() --- UPGRADING | 12 ++++++++++-- Zend/tests/gc_037.phpt | 22 +++++++++++++++++++--- Zend/tests/gc_045.phpt | 12 ++++++++++-- Zend/zend_builtin_functions.c | 6 ++++++ Zend/zend_gc.c | 29 +++++++++++++++++++++++++++++ Zend/zend_gc.h | 6 ++++++ 6 files changed, 80 insertions(+), 7 deletions(-) diff --git a/UPGRADING b/UPGRADING index 12189958faaeb..9239ab1379991 100644 --- a/UPGRADING +++ b/UPGRADING @@ -115,12 +115,20 @@ PHP 8.3 UPGRADE NOTES ======================================== - Core: - . gc_status() has added the following 4 fields: + . gc_status() has added the following 8 fields: "running" => bool "protected" => bool "full" => bool "buffer_size" => int - See GH-9336 + "application_time" => float: Total application time, in seconds (including + collector_time) + "collector_time" => float: Time spend collecting cycles, in seconds + (including destructor_time and free_time) + "destructor_time" => float: Time spend executing destructors during + cycle collection, in seconds + "free_time" => float: Time freeing values during cycle collection, in + seconds + See GH-9336, GH-??? . class_alias() now supports creating an alias of an internal class. . Setting `open_basedir` at runtime using `ini_set('open_basedir', ...);` no longer accepts paths containing the parent directory (`..`). Previously, diff --git a/Zend/tests/gc_037.phpt b/Zend/tests/gc_037.phpt index 64f21c86c4e90..35951bd23337d 100644 --- a/Zend/tests/gc_037.phpt +++ b/Zend/tests/gc_037.phpt @@ -12,8 +12,8 @@ gc_collect_cycles(); gc_collect_cycles(); var_dump(gc_status()); ?> ---EXPECT-- -array(8) { +--EXPECTF-- +array(12) { ["running"]=> bool(false) ["protected"]=> @@ -30,8 +30,16 @@ array(8) { int(16384) ["roots"]=> int(1) + ["application_time"]=> + float(%f) + ["collector_time"]=> + float(%f) + ["destructor_time"]=> + float(%f) + ["free_time"]=> + float(%f) } -array(8) { +array(12) { ["running"]=> bool(false) ["protected"]=> @@ -48,4 +56,12 @@ array(8) { int(16384) ["roots"]=> int(0) + ["application_time"]=> + float(%f) + ["collector_time"]=> + float(%f) + ["destructor_time"]=> + float(%f) + ["free_time"]=> + float(%f) } diff --git a/Zend/tests/gc_045.phpt b/Zend/tests/gc_045.phpt index 3789b97aeb649..1762be5db1ad9 100644 --- a/Zend/tests/gc_045.phpt +++ b/Zend/tests/gc_045.phpt @@ -45,8 +45,8 @@ for ($j = 0; $j < 10; $j++) { var_dump(gc_status()); ?> ---EXPECT-- -array(8) { +--EXPECTF-- +array(12) { ["running"]=> bool(false) ["protected"]=> @@ -63,4 +63,12 @@ array(8) { int(16384) ["roots"]=> int(10000) + ["application_time"]=> + float(%f) + ["collector_time"]=> + float(%f) + ["destructor_time"]=> + float(%f) + ["free_time"]=> + float(%f) } diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index acf69536d4593..d57f9802ffde2 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -148,6 +148,12 @@ ZEND_FUNCTION(gc_status) add_assoc_long_ex(return_value, "threshold", sizeof("threshold")-1, (long)status.threshold); add_assoc_long_ex(return_value, "buffer_size", sizeof("buffer_size")-1, (long)status.buf_size); add_assoc_long_ex(return_value, "roots", sizeof("roots")-1, (long)status.num_roots); + + /* Using double because zend_long may be too small on some platforms */ + add_assoc_double_ex(return_value, "application_time", sizeof("application_time")-1, (double) status.application_time / ZEND_NANO_IN_SEC); + add_assoc_double_ex(return_value, "collector_time", sizeof("collector_time")-1, (double) status.collector_time / ZEND_NANO_IN_SEC); + add_assoc_double_ex(return_value, "destructor_time", sizeof("destructor_time")-1, (double) status.dtor_time / ZEND_NANO_IN_SEC); + add_assoc_double_ex(return_value, "free_time", sizeof("free_time")-1, (double) status.free_time / ZEND_NANO_IN_SEC); } /* }}} */ diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 3bdb79b9c4c11..98f35a6388686 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -69,6 +69,7 @@ #include "zend.h" #include "zend_API.h" #include "zend_fibers.h" +#include "zend_time.h" #ifndef ZEND_GC_DEBUG # define ZEND_GC_DEBUG 0 @@ -220,6 +221,11 @@ typedef struct _zend_gc_globals { uint32_t gc_runs; uint32_t collected; + zend_time_t activated_at; + zend_time_t collector_time; + zend_time_t dtor_time; + zend_time_t free_time; + #if GC_BENCH uint32_t root_buf_length; uint32_t root_buf_peak; @@ -439,6 +445,9 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals) gc_globals->gc_runs = 0; gc_globals->collected = 0; + gc_globals->collector_time = 0; + gc_globals->dtor_time = 0; + gc_globals->free_time = 0; #if GC_BENCH gc_globals->root_buf_length = 0; @@ -479,6 +488,10 @@ void gc_reset(void) GC_G(gc_runs) = 0; GC_G(collected) = 0; + GC_G(collector_time) = 0; + GC_G(dtor_time) = 0; + GC_G(free_time) = 0; + #if GC_BENCH GC_G(root_buf_length) = 0; GC_G(root_buf_peak) = 0; @@ -488,6 +501,8 @@ void gc_reset(void) GC_G(zval_marked_grey) = 0; #endif } + + GC_G(activated_at) = zend_monotonic_time(); } ZEND_API bool gc_enable(bool enable) @@ -1469,6 +1484,8 @@ ZEND_API int zend_gc_collect_cycles(void) bool should_rerun_gc = 0; bool did_rerun_gc = 0; + zend_time_t start_time = zend_monotonic_time(); + rerun_gc: if (GC_G(num_roots)) { int count; @@ -1482,6 +1499,7 @@ ZEND_API int zend_gc_collect_cycles(void) stack.next = NULL; if (GC_G(gc_active)) { + GC_G(collector_time) += zend_monotonic_time() - start_time; return 0; } @@ -1561,6 +1579,7 @@ ZEND_API int zend_gc_collect_cycles(void) * * The root buffer might be reallocated during destructors calls, * make sure to reload pointers as necessary. */ + zend_time_t dtor_start_time = zend_monotonic_time(); idx = GC_FIRST_ROOT; while (idx != end) { current = GC_IDX2PTR(idx); @@ -1582,11 +1601,13 @@ ZEND_API int zend_gc_collect_cycles(void) } idx++; } + GC_G(dtor_time) += zend_monotonic_time() - dtor_start_time; if (GC_G(gc_protected)) { /* something went wrong */ zend_get_gc_buffer_release(); zend_fiber_switch_unblock(); + GC_G(collector_time) += zend_monotonic_time() - start_time; return 0; } } @@ -1595,6 +1616,7 @@ ZEND_API int zend_gc_collect_cycles(void) /* Destroy zvals. The root buffer may be reallocated. */ GC_TRACE("Destroying zvals"); + zend_time_t free_start_time = zend_monotonic_time(); idx = GC_FIRST_ROOT; while (idx != end) { current = GC_IDX2PTR(idx); @@ -1645,6 +1667,8 @@ ZEND_API int zend_gc_collect_cycles(void) current++; } + GC_G(free_time) += zend_monotonic_time() - free_start_time; + zend_fiber_switch_unblock(); GC_TRACE("Collection finished"); @@ -1666,6 +1690,7 @@ ZEND_API int zend_gc_collect_cycles(void) finish: zend_get_gc_buffer_release(); zend_gc_root_tmpvars(); + GC_G(collector_time) += zend_monotonic_time() - start_time; return total_count; } @@ -1679,6 +1704,10 @@ ZEND_API void zend_gc_get_status(zend_gc_status *status) status->threshold = GC_G(gc_threshold); status->buf_size = GC_G(buf_size); status->num_roots = GC_G(num_roots); + status->application_time = zend_monotonic_time() - GC_G(activated_at); + status->collector_time = GC_G(collector_time); + status->dtor_time = GC_G(dtor_time); + status->free_time = GC_G(free_time); } ZEND_API zend_get_gc_buffer *zend_get_gc_buffer_create(void) { diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index 2e80ec04bfe3b..18541283a6c47 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -24,6 +24,8 @@ # define GC_BENCH 0 #endif +#include "zend_time.h" + BEGIN_EXTERN_C() typedef struct _zend_gc_status { @@ -35,6 +37,10 @@ typedef struct _zend_gc_status { uint32_t threshold; uint32_t buf_size; uint32_t num_roots; + zend_time_t application_time; + zend_time_t collector_time; + zend_time_t dtor_time; + zend_time_t free_time; } zend_gc_status; ZEND_API extern int (*gc_collect_cycles)(void); From eba988bc95b7a414ebd96655c5866828b1e0e1c6 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 12:52:45 +0200 Subject: [PATCH 03/13] Return failure --- Zend/zend_time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_time.c b/Zend/zend_time.c index 92bf56e8e2fdb..2eb42025fad9e 100644 --- a/Zend/zend_time.c +++ b/Zend/zend_time.c @@ -86,7 +86,7 @@ zend_result zend_startup_time(void) #else /* Timer unavailable. */ -# error "Monotonic timer unavailable" + return FAILURE; #endif return SUCCESS; From 41f325201a89669c5cde28aa3064e529c751964b Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 12:48:08 +0200 Subject: [PATCH 04/13] Update initial array size --- Zend/zend_builtin_functions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index d57f9802ffde2..9b2d14e4f692d 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -138,7 +138,7 @@ ZEND_FUNCTION(gc_status) zend_gc_get_status(&status); - array_init_size(return_value, 8); + array_init_size(return_value, 16); add_assoc_bool_ex(return_value, "running", sizeof("running")-1, status.active); add_assoc_bool_ex(return_value, "protected", sizeof("protected")-1, status.gc_protected); From c7fc79ecb884b69fa3cb4dc595e25caf8f2ab4b4 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 14:03:51 +0200 Subject: [PATCH 05/13] Rename zend_time -> zend_hrtime --- UPGRADING.INTERNALS | 7 +-- Zend/zend.c | 4 +- Zend/zend_gc.c | 30 ++++++------ Zend/zend_gc.h | 10 ++-- Zend/{zend_time.c => zend_hrtime.c} | 12 ++--- Zend/{zend_time.h => zend_hrtime.h} | 75 +++++++++++++++-------------- configure.ac | 2 +- ext/standard/hrtime.c | 10 ++-- 8 files changed, 77 insertions(+), 73 deletions(-) rename Zend/{zend_time.c => zend_hrtime.c} (88%) rename Zend/{zend_time.h => zend_hrtime.h} (53%) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 76b05ef16680f..fed2255fbc938 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -67,9 +67,10 @@ PHP 8.3 INTERNALS UPGRADE NOTES - zend_set_user_opcode_handler - zend_ssa_inference * Removed unused macros PHP_FNV1_32A_INIT and PHP_FNV1A_64_INIT. See GH-11114. -* Removed ext/standard/hrtime.h, PHP_HRTIME_ macros, HRTIME_AVAILABLE, and - php_hrtime_current(). -* Added Zend/zend_time.h, ZEND_MONOTONIC_TIME_AVAILABLE, zend_monotonic_time() +* ext/standard/hrtime.h was moved to Zend/zend_hrtime.h + * The prefix of PHP_HRTIME_ macros was changed to ZEND_HRTIME_ + * The HRTIME_AVAILABLE macro was renamed to ZEND_HRTIME_AVAILABLE + * The ··php_hrtime_current() function was renamed to zend_hrtime() ======================== 2. Build system changes diff --git a/Zend/zend.c b/Zend/zend.c index 461b85479ce90..54e9a85808cb9 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -37,7 +37,7 @@ #include "zend_fibers.h" #include "zend_call_stack.h" #include "zend_max_execution_timer.h" -#include "zend_time.h" +#include "zend_hrtime.h" #include "Optimizer/zend_optimizer.h" static size_t global_map_ptr_last = 0; @@ -900,7 +900,7 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */ fpsetmask(0); #endif - zend_startup_time(); + zend_startup_hrtime(); zend_startup_strtod(); zend_startup_extensions_mechanism(); diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 98f35a6388686..f66b9d994974a 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -69,7 +69,7 @@ #include "zend.h" #include "zend_API.h" #include "zend_fibers.h" -#include "zend_time.h" +#include "zend_hrtime.h" #ifndef ZEND_GC_DEBUG # define ZEND_GC_DEBUG 0 @@ -221,10 +221,10 @@ typedef struct _zend_gc_globals { uint32_t gc_runs; uint32_t collected; - zend_time_t activated_at; - zend_time_t collector_time; - zend_time_t dtor_time; - zend_time_t free_time; + zend_hrtime_t activated_at; + zend_hrtime_t collector_time; + zend_hrtime_t dtor_time; + zend_hrtime_t free_time; #if GC_BENCH uint32_t root_buf_length; @@ -502,7 +502,7 @@ void gc_reset(void) #endif } - GC_G(activated_at) = zend_monotonic_time(); + GC_G(activated_at) = zend_hrtime(); } ZEND_API bool gc_enable(bool enable) @@ -1484,7 +1484,7 @@ ZEND_API int zend_gc_collect_cycles(void) bool should_rerun_gc = 0; bool did_rerun_gc = 0; - zend_time_t start_time = zend_monotonic_time(); + zend_hrtime_t start_time = zend_hrtime(); rerun_gc: if (GC_G(num_roots)) { @@ -1499,7 +1499,7 @@ ZEND_API int zend_gc_collect_cycles(void) stack.next = NULL; if (GC_G(gc_active)) { - GC_G(collector_time) += zend_monotonic_time() - start_time; + GC_G(collector_time) += zend_hrtime() - start_time; return 0; } @@ -1579,7 +1579,7 @@ ZEND_API int zend_gc_collect_cycles(void) * * The root buffer might be reallocated during destructors calls, * make sure to reload pointers as necessary. */ - zend_time_t dtor_start_time = zend_monotonic_time(); + zend_hrtime_t dtor_start_time = zend_hrtime(); idx = GC_FIRST_ROOT; while (idx != end) { current = GC_IDX2PTR(idx); @@ -1601,13 +1601,13 @@ ZEND_API int zend_gc_collect_cycles(void) } idx++; } - GC_G(dtor_time) += zend_monotonic_time() - dtor_start_time; + GC_G(dtor_time) += zend_hrtime() - dtor_start_time; if (GC_G(gc_protected)) { /* something went wrong */ zend_get_gc_buffer_release(); zend_fiber_switch_unblock(); - GC_G(collector_time) += zend_monotonic_time() - start_time; + GC_G(collector_time) += zend_hrtime() - start_time; return 0; } } @@ -1616,7 +1616,7 @@ ZEND_API int zend_gc_collect_cycles(void) /* Destroy zvals. The root buffer may be reallocated. */ GC_TRACE("Destroying zvals"); - zend_time_t free_start_time = zend_monotonic_time(); + zend_hrtime_t free_start_time = zend_hrtime(); idx = GC_FIRST_ROOT; while (idx != end) { current = GC_IDX2PTR(idx); @@ -1667,7 +1667,7 @@ ZEND_API int zend_gc_collect_cycles(void) current++; } - GC_G(free_time) += zend_monotonic_time() - free_start_time; + GC_G(free_time) += zend_hrtime() - free_start_time; zend_fiber_switch_unblock(); @@ -1690,7 +1690,7 @@ ZEND_API int zend_gc_collect_cycles(void) finish: zend_get_gc_buffer_release(); zend_gc_root_tmpvars(); - GC_G(collector_time) += zend_monotonic_time() - start_time; + GC_G(collector_time) += zend_hrtime() - start_time; return total_count; } @@ -1704,7 +1704,7 @@ ZEND_API void zend_gc_get_status(zend_gc_status *status) status->threshold = GC_G(gc_threshold); status->buf_size = GC_G(buf_size); status->num_roots = GC_G(num_roots); - status->application_time = zend_monotonic_time() - GC_G(activated_at); + status->application_time = zend_hrtime() - GC_G(activated_at); status->collector_time = GC_G(collector_time); status->dtor_time = GC_G(dtor_time); status->free_time = GC_G(free_time); diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index 18541283a6c47..9f2acd119da07 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -24,7 +24,7 @@ # define GC_BENCH 0 #endif -#include "zend_time.h" +#include "zend_hrtime.h" BEGIN_EXTERN_C() @@ -37,10 +37,10 @@ typedef struct _zend_gc_status { uint32_t threshold; uint32_t buf_size; uint32_t num_roots; - zend_time_t application_time; - zend_time_t collector_time; - zend_time_t dtor_time; - zend_time_t free_time; + zend_hrtime_t application_time; + zend_hrtime_t collector_time; + zend_hrtime_t dtor_time; + zend_hrtime_t free_time; } zend_gc_status; ZEND_API extern int (*gc_collect_cycles)(void); diff --git a/Zend/zend_time.c b/Zend/zend_hrtime.c similarity index 88% rename from Zend/zend_time.c rename to Zend/zend_hrtime.c index 2eb42025fad9e..2e3dc720da97d 100644 --- a/Zend/zend_time.c +++ b/Zend/zend_hrtime.c @@ -16,7 +16,7 @@ */ #include "zend.h" -#include "zend_time.h" +#include "zend_hrtime.h" /* This file reuses code parts from the cross-platform timer library Public Domain - 2011 Mattias Jansson / Rampant Pixels */ @@ -31,13 +31,13 @@ # define WIN32_LEAN_AND_MEAN -double zend_timer_scale = .0; +double zend_hrtime_timer_scale = .0; #elif ZEND_TIME_PLATFORM_APPLE # include # include -mach_timebase_info_data_t zend_timerlib_info; +mach_timebase_info_data_t zend_hrtime_timerlib_info; #elif ZEND_TIME_PLATFORM_HPUX @@ -50,7 +50,7 @@ mach_timebase_info_data_t zend_timerlib_info; #endif -zend_result zend_startup_time(void) +zend_result zend_startup_hrtime(void) { #if ZEND_TIME_PLATFORM_WINDOWS @@ -58,11 +58,11 @@ zend_result zend_startup_time(void) if (!QueryPerformanceFrequency(&tf) || 0 == tf.QuadPart) { return FAILURE; } - zend_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_time_t)tf.QuadPart; + zend_hrtime_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_hrtime_t)tf.QuadPart; #elif ZEND_TIME_PLATFORM_APPLE - if (mach_timebase_info(&zend_timerlib_info)) { + if (mach_timebase_info(&zend_hrtime_timerlib_info)) { return FAILURE; } diff --git a/Zend/zend_time.h b/Zend/zend_hrtime.h similarity index 53% rename from Zend/zend_time.h rename to Zend/zend_hrtime.h index f18078bbe6dc1..d2b1b3a9008c3 100644 --- a/Zend/zend_time.h +++ b/Zend/zend_hrtime.h @@ -15,8 +15,8 @@ +----------------------------------------------------------------------+ */ -#ifndef ZEND_TIME_H -#define ZEND_TIME_H +#ifndef ZEND_HRTIME_H +#define ZEND_HRTIME_H #ifdef HAVE_UNISTD_H # include @@ -25,75 +25,78 @@ # include #endif -#define ZEND_TIME_PLATFORM_POSIX 0 -#define ZEND_TIME_PLATFORM_WINDOWS 0 -#define ZEND_TIME_PLATFORM_APPLE 0 -#define ZEND_TIME_PLATFORM_HPUX 0 -#define ZEND_TIME_PLATFORM_AIX 0 +/* This file reuses code parts from the cross-platform timer library + Public Domain - 2011 Mattias Jansson / Rampant Pixels */ + +#define ZEND_HRTIME_PLATFORM_POSIX 0 +#define ZEND_HRTIME_PLATFORM_WINDOWS 0 +#define ZEND_HRTIME_PLATFORM_APPLE 0 +#define ZEND_HRTIME_PLATFORM_HPUX 0 +#define ZEND_HRTIME_PLATFORM_AIX 0 #if defined(_POSIX_TIMERS) && ((_POSIX_TIMERS > 0) || defined(__OpenBSD__)) && defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC) -# undef ZEND_TIME_PLATFORM_POSIX -# define ZEND_TIME_PLATFORM_POSIX 1 +# undef ZEND_HRTIME_PLATFORM_POSIX +# define ZEND_HRTIME_PLATFORM_POSIX 1 #elif defined(_WIN32) || defined(_WIN64) -# undef ZEND_TIME_PLATFORM_WINDOWS -# define ZEND_TIME_PLATFORM_WINDOWS 1 +# undef ZEND_HRTIME_PLATFORM_WINDOWS +# define ZEND_HRTIME_PLATFORM_WINDOWS 1 #elif defined(__APPLE__) -# undef ZEND_TIME_PLATFORM_APPLE -# define ZEND_TIME_PLATFORM_APPLE 1 +# undef ZEND_HRTIME_PLATFORM_APPLE +# define ZEND_HRTIME_PLATFORM_APPLE 1 #elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__))) -# undef ZEND_TIME_PLATFORM_HPUX -# define ZEND_TIME_PLATFORM_HPUX 1 +# undef ZEND_HRTIME_PLATFORM_HPUX +# define ZEND_HRTIME_PLATFORM_HPUX 1 #elif defined(_AIX) -# undef ZEND_TIME_PLATFORM_AIX -# define ZEND_TIME_PLATFORM_AIX 1 +# undef ZEND_HRTIME_PLATFORM_AIX +# define ZEND_HRTIME_PLATFORM_AIX 1 #endif -#define ZEND_MONOTONIC_TIME_AVAILABLE (ZEND_TIME_PLATFORM_POSIX || ZEND_TIME_PLATFORM_WINDOWS || ZEND_TIME_PLATFORM_APPLE || ZEND_TIME_PLATFORM_HPUX || ZEND_TIME_PLATFORM_AIX) +#define ZEND_HRTIME_AVAILABLE (ZEND_HRTIME_PLATFORM_POSIX || ZEND_HRTIME_PLATFORM_WINDOWS || ZEND_HRTIME_PLATFORM_APPLE || ZEND_HRTIME_PLATFORM_HPUX || ZEND_HRTIME_PLATFORM_AIX) #include "zend_portability.h" #include "zend_types.h" BEGIN_EXTERN_C() -#if ZEND_TIME_PLATFORM_WINDOWS +#if ZEND_HRTIME_PLATFORM_WINDOWS -extern double zend_timer_scale = .0; +extern double zend_hrtime_timer_scale = .0; -#elif ZEND_TIME_PLATFORM_APPLE +#elif ZEND_HRTIME_PLATFORM_APPLE # include # include -extern mach_timebase_info_data_t zend_timerlib_info; +extern mach_timebase_info_data_t zend_hrtime_timerlib_info; #endif #define ZEND_NANO_IN_SEC 1000000000 -typedef uint64_t zend_time_t; +typedef uint64_t zend_hrtime_t; -zend_result zend_startup_time(void); +zend_result zend_startup_hrtime(void); -static zend_always_inline zend_time_t zend_monotonic_time(void) +static zend_always_inline zend_hrtime_t zend_hrtime(void) { -#if ZEND_TIME_PLATFORM_WINDOWS +#if ZEND_HRTIME_PLATFORM_WINDOWS LARGE_INTEGER lt = {0}; QueryPerformanceCounter(<); - return (zend_time_t)((zend_time_t)lt.QuadPart * zend_timer_scale); -#elif ZEND_TIME_PLATFORM_APPLE - return (zend_time_t)mach_absolute_time() * zend_timerlib_info.numer / zend_timerlib_info.denom; -#elif ZEND_TIME_PLATFORM_POSIX + return (zend_hrtime_t)((zend_hrtime_t)lt.QuadPart * zend_timer_scale); +#elif ZEND_HRTIME_PLATFORM_APPLE + return (zend_hrtime_t)mach_absolute_time() * zend_timerlib_info.numer / zend_timerlib_info.denom; +#elif ZEND_HRTIME_PLATFORM_POSIX struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) { - return ((zend_time_t) ts.tv_sec * (zend_time_t)ZEND_NANO_IN_SEC) + ts.tv_nsec; + return ((zend_hrtime_t) ts.tv_sec * (zend_hrtime_t)ZEND_NANO_IN_SEC) + ts.tv_nsec; } return 0; -#elif ZEND_TIME_PLATFORM_HPUX - return (zend_time_t) gethrtime(); -#elif ZEND_TIME_PLATFORM_AIX +#elif ZEND_HRTIME_PLATFORM_HPUX + return (zend_hrtime_t) gethrtime(); +#elif ZEND_HRTIME_PLATFORM_AIX timebasestruct_t t; read_wall_time(&t, TIMEBASE_SZ); time_base_to_time(&t, TIMEBASE_SZ); - return (zend_time_t) t.tb_high * (zend_time_t)NANO_IN_SEC + t.tb_low; + return (zend_hrtime_t) t.tb_high * (zend_hrtime_t)NANO_IN_SEC + t.tb_low; #else return 0; #endif @@ -101,4 +104,4 @@ static zend_always_inline zend_time_t zend_monotonic_time(void) END_EXTERN_C() -#endif /* ZEND_TIME_H */ +#endif /* ZEND_HRTIME_H */ diff --git a/configure.ac b/configure.ac index 8503942412500..109a18ea3c639 100644 --- a/configure.ac +++ b/configure.ac @@ -1735,7 +1735,7 @@ PHP_ADD_SOURCES(Zend, \ zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_gdb.c \ zend_observer.c zend_system_id.c zend_enum.c zend_fibers.c zend_atomic.c \ zend_max_execution_timer.c \ - zend_time.c \ + zend_hrtime.c \ Optimizer/zend_optimizer.c \ Optimizer/pass1.c \ Optimizer/pass3.c \ diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c index 4f3f9fe2e577c..6af8bfc965069 100644 --- a/ext/standard/hrtime.c +++ b/ext/standard/hrtime.c @@ -16,7 +16,7 @@ */ #include "php.h" -#include "zend_time.h" +#include "zend_hrtime.h" #ifdef ZEND_ENABLE_ZVAL_LONG64 #define PHP_RETURN_HRTIME(t) RETURN_LONG((zend_long)t) @@ -46,9 +46,9 @@ delivered timestamp is monotonic and cannot be adjusted. */ PHP_FUNCTION(hrtime) { -#if ZEND_MONOTONIC_TIME_AVAILABLE +#if ZEND_HRTIME_AVAILABLE bool get_as_num = 0; - zend_time_t t = zend_monotonic_time(); + zend_hrtime_t t = zend_hrtime(); ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL @@ -60,8 +60,8 @@ PHP_FUNCTION(hrtime) } else { array_init_size(return_value, 2); zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); - add_next_index_long(return_value, (zend_long)(t / (zend_time_t)ZEND_NANO_IN_SEC)); - add_next_index_long(return_value, (zend_long)(t % (zend_time_t)ZEND_NANO_IN_SEC)); + add_next_index_long(return_value, (zend_long)(t / (zend_hrtime_t)ZEND_NANO_IN_SEC)); + add_next_index_long(return_value, (zend_long)(t % (zend_hrtime_t)ZEND_NANO_IN_SEC)); } #else RETURN_FALSE; From 92c60801d69a50a9f2fed86b30378814aa50ccfd Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 14:04:10 +0200 Subject: [PATCH 06/13] Fix windows build --- win32/build/config.w32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 20fcf2409922f..d7843cd823a1c 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -240,7 +240,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c zend_weakrefs.c \ zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \ zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_observer.c zend_system_id.c \ - zend_enum.c zend_fibers.c zend_atomic.c"); + zend_enum.c zend_fibers.c zend_atomic.c zend_hrtime.c"); ADD_SOURCES("Zend\\Optimizer", "zend_optimizer.c pass1.c pass3.c optimize_func_calls.c block_pass.c optimize_temp_vars_5.c nop_removal.c compact_literals.c zend_cfg.c zend_dfg.c dfa_pass.c zend_ssa.c zend_inference.c zend_func_info.c zend_call_graph.c zend_dump.c escape_analysis.c compact_vars.c dce.c sccp.c scdf.c"); var PHP_ASSEMBLER = PATH_PROG({ From 5e514e66c3fb5526fcd2b4c50f9c4b77274f2241 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 14:21:31 +0200 Subject: [PATCH 07/13] Actually rename --- Zend/zend_hrtime.c | 20 ++++++++++---------- Zend/zend_hrtime.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Zend/zend_hrtime.c b/Zend/zend_hrtime.c index 2e3dc720da97d..e17364911ca1e 100644 --- a/Zend/zend_hrtime.c +++ b/Zend/zend_hrtime.c @@ -21,29 +21,29 @@ /* This file reuses code parts from the cross-platform timer library Public Domain - 2011 Mattias Jansson / Rampant Pixels */ -#if ZEND_TIME_PLATFORM_POSIX +#if ZEND_HRTIME_PLATFORM_POSIX # include # include # include -#elif ZEND_TIME_PLATFORM_WINDOWS +#elif ZEND_HRTIME_PLATFORM_WINDOWS # define WIN32_LEAN_AND_MEAN double zend_hrtime_timer_scale = .0; -#elif ZEND_TIME_PLATFORM_APPLE +#elif ZEND_HRTIME_PLATFORM_APPLE # include # include mach_timebase_info_data_t zend_hrtime_timerlib_info; -#elif ZEND_TIME_PLATFORM_HPUX +#elif ZEND_HRTIME_PLATFORM_HPUX # include -#elif ZEND_TIME_PLATFORM_AIX +#elif ZEND_HRTIME_PLATFORM_AIX # include # include @@ -52,7 +52,7 @@ mach_timebase_info_data_t zend_hrtime_timerlib_info; zend_result zend_startup_hrtime(void) { -#if ZEND_TIME_PLATFORM_WINDOWS +#if ZEND_HRTIME_PLATFORM_WINDOWS LARGE_INTEGER tf = {0}; if (!QueryPerformanceFrequency(&tf) || 0 == tf.QuadPart) { @@ -60,13 +60,13 @@ zend_result zend_startup_hrtime(void) } zend_hrtime_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_hrtime_t)tf.QuadPart; -#elif ZEND_TIME_PLATFORM_APPLE +#elif ZEND_HRTIME_PLATFORM_APPLE if (mach_timebase_info(&zend_hrtime_timerlib_info)) { return FAILURE; } -#elif ZEND_TIME_PLATFORM_POSIX +#elif ZEND_HRTIME_PLATFORM_POSIX #if !_POSIX_MONOTONIC_CLOCK #ifdef _SC_MONOTONIC_CLOCK @@ -76,11 +76,11 @@ zend_result zend_startup_hrtime(void) #endif #endif -#elif ZEND_TIME_PLATFORM_HPUX +#elif ZEND_HRTIME_PLATFORM_HPUX /* pass */ -#elif ZEND_TIME_PLATFORM_AIX +#elif ZEND_HRTIME_PLATFORM_AIX /* pass */ diff --git a/Zend/zend_hrtime.h b/Zend/zend_hrtime.h index d2b1b3a9008c3..3e70f8b384923 100644 --- a/Zend/zend_hrtime.h +++ b/Zend/zend_hrtime.h @@ -81,9 +81,9 @@ static zend_always_inline zend_hrtime_t zend_hrtime(void) #if ZEND_HRTIME_PLATFORM_WINDOWS LARGE_INTEGER lt = {0}; QueryPerformanceCounter(<); - return (zend_hrtime_t)((zend_hrtime_t)lt.QuadPart * zend_timer_scale); + return (zend_hrtime_t)((zend_hrtime_t)lt.QuadPart * zend_hrtime_timer_scale); #elif ZEND_HRTIME_PLATFORM_APPLE - return (zend_hrtime_t)mach_absolute_time() * zend_timerlib_info.numer / zend_timerlib_info.denom; + return (zend_hrtime_t)mach_absolute_time() * zend_hrtime_timerlib_info.numer / zend_hrtime_timerlib_info.denom; #elif ZEND_HRTIME_PLATFORM_POSIX struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) { From c6c9a9d9af7f0e9fa7bf3baaba0f4fb73a3eba0b Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 14:21:47 +0200 Subject: [PATCH 08/13] UPGRADING --- UPGRADING | 2 +- UPGRADING.INTERNALS | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/UPGRADING b/UPGRADING index 9239ab1379991..0023fdb6804cd 100644 --- a/UPGRADING +++ b/UPGRADING @@ -128,7 +128,7 @@ PHP 8.3 UPGRADE NOTES cycle collection, in seconds "free_time" => float: Time freeing values during cycle collection, in seconds - See GH-9336, GH-??? + See GH-9336, GH-11523 . class_alias() now supports creating an alias of an internal class. . Setting `open_basedir` at runtime using `ini_set('open_basedir', ...);` no longer accepts paths containing the parent directory (`..`). Previously, diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index fed2255fbc938..cfa5d9465fe23 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -68,9 +68,9 @@ PHP 8.3 INTERNALS UPGRADE NOTES - zend_ssa_inference * Removed unused macros PHP_FNV1_32A_INIT and PHP_FNV1A_64_INIT. See GH-11114. * ext/standard/hrtime.h was moved to Zend/zend_hrtime.h - * The prefix of PHP_HRTIME_ macros was changed to ZEND_HRTIME_ + * The prefix of the PHP_HRTIME_ macros was changed to ZEND_HRTIME_ * The HRTIME_AVAILABLE macro was renamed to ZEND_HRTIME_AVAILABLE - * The ··php_hrtime_current() function was renamed to zend_hrtime() + * The php_hrtime_current() function was renamed to zend_hrtime() ======================== 2. Build system changes From 4e8c2ed81de88f01d4fecd2440c8d0e46919db22 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 25 Jun 2023 14:44:31 +0200 Subject: [PATCH 09/13] Fix windows build --- Zend/zend_hrtime.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_hrtime.h b/Zend/zend_hrtime.h index 3e70f8b384923..be863903419e5 100644 --- a/Zend/zend_hrtime.h +++ b/Zend/zend_hrtime.h @@ -60,7 +60,7 @@ BEGIN_EXTERN_C() #if ZEND_HRTIME_PLATFORM_WINDOWS -extern double zend_hrtime_timer_scale = .0; +extern double zend_hrtime_timer_scale; #elif ZEND_HRTIME_PLATFORM_APPLE From 5d73e31c4107041f9fe73b7b28f47c4360d6e2e5 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 27 Jun 2023 11:20:42 +0200 Subject: [PATCH 10/13] Initialize activated_at in globals ctors --- Zend/zend_gc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index f66b9d994974a..d7b6cc7e6a2a9 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -448,6 +448,7 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals) gc_globals->collector_time = 0; gc_globals->dtor_time = 0; gc_globals->free_time = 0; + gc_globals->activated_at = 0; #if GC_BENCH gc_globals->root_buf_length = 0; From f580e4d5e79c9a3061f81db66b6652f0679b7444 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 27 Jun 2023 11:22:42 +0200 Subject: [PATCH 11/13] Includes first --- Zend/zend_gc.h | 4 ++-- Zend/zend_hrtime.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index 9f2acd119da07..9d0cca57f851b 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -20,12 +20,12 @@ #ifndef ZEND_GC_H #define ZEND_GC_H +#include "zend_hrtime.h" + #ifndef GC_BENCH # define GC_BENCH 0 #endif -#include "zend_hrtime.h" - BEGIN_EXTERN_C() typedef struct _zend_gc_status { diff --git a/Zend/zend_hrtime.h b/Zend/zend_hrtime.h index be863903419e5..c8560cc7fe52b 100644 --- a/Zend/zend_hrtime.h +++ b/Zend/zend_hrtime.h @@ -18,6 +18,9 @@ #ifndef ZEND_HRTIME_H #define ZEND_HRTIME_H +#include "zend_portability.h" +#include "zend_types.h" + #ifdef HAVE_UNISTD_H # include #endif @@ -53,9 +56,6 @@ #define ZEND_HRTIME_AVAILABLE (ZEND_HRTIME_PLATFORM_POSIX || ZEND_HRTIME_PLATFORM_WINDOWS || ZEND_HRTIME_PLATFORM_APPLE || ZEND_HRTIME_PLATFORM_HPUX || ZEND_HRTIME_PLATFORM_AIX) -#include "zend_portability.h" -#include "zend_types.h" - BEGIN_EXTERN_C() #if ZEND_HRTIME_PLATFORM_WINDOWS From 30024166949ed17c70537610835a325957d2f79d Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 27 Jun 2023 14:47:40 +0200 Subject: [PATCH 12/13] UPGRADING: typos --- UPGRADING | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UPGRADING b/UPGRADING index 0023fdb6804cd..a3f1667d69f64 100644 --- a/UPGRADING +++ b/UPGRADING @@ -122,11 +122,11 @@ PHP 8.3 UPGRADE NOTES "buffer_size" => int "application_time" => float: Total application time, in seconds (including collector_time) - "collector_time" => float: Time spend collecting cycles, in seconds + "collector_time" => float: Time spent collecting cycles, in seconds (including destructor_time and free_time) - "destructor_time" => float: Time spend executing destructors during + "destructor_time" => float: Time spent executing destructors during cycle collection, in seconds - "free_time" => float: Time freeing values during cycle collection, in + "free_time" => float: Time spent freeing values during cycle collection, in seconds See GH-9336, GH-11523 . class_alias() now supports creating an alias of an internal class. From 0713de3bc5118228798d5c15b9d7fc5c216be8dd Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 14 Jul 2023 16:02:20 +0200 Subject: [PATCH 13/13] Review --- Zend/zend_hrtime.c | 39 ++++++++------------------------------- Zend/zend_hrtime.h | 6 +++--- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/Zend/zend_hrtime.c b/Zend/zend_hrtime.c index e17364911ca1e..a28ba3f470508 100644 --- a/Zend/zend_hrtime.c +++ b/Zend/zend_hrtime.c @@ -37,7 +37,10 @@ double zend_hrtime_timer_scale = .0; # include # include -mach_timebase_info_data_t zend_hrtime_timerlib_info; +mach_timebase_info_data_t zend_hrtime_timerlib_info = { + .numer = 0, + .denom = 1, +}; #elif ZEND_HRTIME_PLATFORM_HPUX @@ -50,44 +53,18 @@ mach_timebase_info_data_t zend_hrtime_timerlib_info; #endif -zend_result zend_startup_hrtime(void) +void zend_startup_hrtime(void) { #if ZEND_HRTIME_PLATFORM_WINDOWS LARGE_INTEGER tf = {0}; - if (!QueryPerformanceFrequency(&tf) || 0 == tf.QuadPart) { - return FAILURE; + if (QueryPerformanceFrequency(&tf) || 0 != tf.QuadPart) { + zend_hrtime_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_hrtime_t)tf.QuadPart; } - zend_hrtime_timer_scale = (double)ZEND_NANO_IN_SEC / (zend_hrtime_t)tf.QuadPart; #elif ZEND_HRTIME_PLATFORM_APPLE - if (mach_timebase_info(&zend_hrtime_timerlib_info)) { - return FAILURE; - } - -#elif ZEND_HRTIME_PLATFORM_POSIX + mach_timebase_info(&zend_hrtime_timerlib_info); -#if !_POSIX_MONOTONIC_CLOCK -#ifdef _SC_MONOTONIC_CLOCK - if (0 >= sysconf(_SC_MONOTONIC_CLOCK)) { - return FAILURE; - } -#endif #endif - -#elif ZEND_HRTIME_PLATFORM_HPUX - - /* pass */ - -#elif ZEND_HRTIME_PLATFORM_AIX - - /* pass */ - -#else - /* Timer unavailable. */ - return FAILURE; -#endif - - return SUCCESS; } diff --git a/Zend/zend_hrtime.h b/Zend/zend_hrtime.h index c8560cc7fe52b..a67c9d210c1ae 100644 --- a/Zend/zend_hrtime.h +++ b/Zend/zend_hrtime.h @@ -70,11 +70,11 @@ extern mach_timebase_info_data_t zend_hrtime_timerlib_info; #endif -#define ZEND_NANO_IN_SEC 1000000000 +#define ZEND_NANO_IN_SEC UINT64_C(1000000000) typedef uint64_t zend_hrtime_t; -zend_result zend_startup_hrtime(void); +void zend_startup_hrtime(void); static zend_always_inline zend_hrtime_t zend_hrtime(void) { @@ -86,7 +86,7 @@ static zend_always_inline zend_hrtime_t zend_hrtime(void) return (zend_hrtime_t)mach_absolute_time() * zend_hrtime_timerlib_info.numer / zend_hrtime_timerlib_info.denom; #elif ZEND_HRTIME_PLATFORM_POSIX struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; - if (0 == clock_gettime(CLOCK_MONOTONIC, &ts)) { + if (EXPECTED(0 == clock_gettime(CLOCK_MONOTONIC, &ts))) { return ((zend_hrtime_t) ts.tv_sec * (zend_hrtime_t)ZEND_NANO_IN_SEC) + ts.tv_nsec; } return 0;