Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Zend/zend.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path);
ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle);
ZEND_API void (*zend_ticks_function)(int ticks);
ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data);
ZEND_API zend_signal_interrupt_result (*zend_signal_interrupt_function)(void);
ZEND_API void (*zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message);
void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
Expand Down Expand Up @@ -972,6 +973,7 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */
zend_resolve_path = utility_functions->resolve_path_function;

zend_interrupt_function = NULL;
zend_signal_interrupt_function = zend_signal_interrupt;

#ifdef HAVE_DTRACE
/* build with dtrace support */
Expand Down
8 changes: 8 additions & 0 deletions Zend/zend.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,14 @@ extern ZEND_API void (*zend_ticks_function)(int ticks);
*/
extern ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data);

typedef enum {
ZEND_SIGNAL_RESTART, /* Restart the interrupted syscall */
ZEND_SIGNAL_INTERRUPT, /* Do not restart */
} zend_signal_interrupt_result;

/* Called when a syscall is interrupted by a signal. Not null. */
extern ZEND_API zend_signal_interrupt_result (*zend_signal_interrupt_function)(void);

extern ZEND_API void (*zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message);
extern ZEND_API void (*zend_on_timeout)(int seconds);
extern ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle);
Expand Down
2 changes: 2 additions & 0 deletions Zend/zend_execute.h
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,8 @@ ZEND_API zend_class_entry *zend_get_executed_scope(void);
ZEND_API bool zend_is_executing(void);
ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg_num);

ZEND_API zend_signal_interrupt_result zend_signal_interrupt(void);

ZEND_API void zend_set_timeout(zend_long seconds, bool reset_signals);
ZEND_API void zend_unset_timeout(void);
ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(void);
Expand Down
9 changes: 9 additions & 0 deletions Zend/zend_execute_API.c
Original file line number Diff line number Diff line change
Expand Up @@ -1431,6 +1431,15 @@ ZEND_API zend_result zend_eval_string_ex(const char *str, zval *retval_ptr, cons
}
/* }}} */

ZEND_API zend_signal_interrupt_result zend_signal_interrupt(void)
{
if (zend_atomic_bool_load_ex(&EG(timed_out))) {
return ZEND_SIGNAL_INTERRUPT;
}

return ZEND_SIGNAL_RESTART;
}

static void zend_set_timeout_ex(zend_long seconds, bool reset_signals);

ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(void) /* {{{ */
Expand Down
7 changes: 5 additions & 2 deletions Zend/zend_hrtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
#elif defined(_AIX)
# undef ZEND_HRTIME_PLATFORM_AIX
# define ZEND_HRTIME_PLATFORM_AIX 1
#else
# error
#endif

#define ZEND_HRTIME_AVAILABLE (ZEND_HRTIME_PLATFORM_POSIX || ZEND_HRTIME_PLATFORM_WINDOWS || ZEND_HRTIME_PLATFORM_APPLE_MACH_ABSOLUTE || ZEND_HRTIME_PLATFORM_APPLE_GETTIME_NSEC || ZEND_HRTIME_PLATFORM_HPUX || ZEND_HRTIME_PLATFORM_AIX)
Expand All @@ -76,6 +78,7 @@ ZEND_API extern clockid_t zend_hrtime_posix_clock_id;

#endif

#define ZEND_HRTIME_T_MAX UINT64_MAX
#define ZEND_NANO_IN_SEC UINT64_C(1000000000)

typedef uint64_t zend_hrtime_t;
Expand All @@ -93,7 +96,7 @@ static zend_always_inline zend_hrtime_t zend_hrtime(void)
#elif ZEND_HRTIME_PLATFORM_APPLE_MACH_ABSOLUTE
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 };
struct timespec ts;
clock_gettime(zend_hrtime_posix_clock_id, &ts);
return ((zend_hrtime_t) ts.tv_sec * (zend_hrtime_t)ZEND_NANO_IN_SEC) + ts.tv_nsec;
#elif ZEND_HRTIME_PLATFORM_HPUX
Expand All @@ -104,7 +107,7 @@ static zend_always_inline zend_hrtime_t zend_hrtime(void)
time_base_to_time(&t, TIMEBASE_SZ);
return (zend_hrtime_t) t.tb_high * (zend_hrtime_t)NANO_IN_SEC + t.tb_low;
#else
return 0;
# error
#endif
}

Expand Down
Loading
Loading