diff -ur -x CVS --new-file php-5.3.0-HEAD/acinclude.m4 php-5.3.0-alarms/acinclude.m4 --- php-5.3.0-HEAD/acinclude.m4 2008-07-03 00:46:17.000000000 -0700 +++ php-5.3.0-alarms/acinclude.m4 2008-07-03 18:12:56.000000000 -0700 @@ -2646,7 +2646,7 @@ with-tsrm-pth | with-tsrm-st | with-tsrm-pthreads[)];; # Allow certain Zend options - with-zend-vm | enable-maintainer-zts | enable-zend-multibyte | enable-inline-optimization[)];; + with-zend-vm | enable-maintainer-zts | enable-zend-multibyte | enable-zend-signals | enable-inline-optimization[)];; # All the rest must be set using the PHP_ARG_* macros # PHP_ARG_* macros set php_enable_ or php_with_ diff -ur -x CVS --new-file php-5.3.0-HEAD/configure.in php-5.3.0-alarms/configure.in --- php-5.3.0-HEAD/configure.in 2008-06-02 09:58:19.000000000 -0700 +++ php-5.3.0-alarms/configure.in 2008-07-03 18:02:00.000000000 -0700 @@ -1403,7 +1403,8 @@ zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \ zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \ zend_ini.c zend_qsort.c zend_multibyte.c zend_ts_hash.c zend_stream.c \ - zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c) + zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c \ + zend_gc.c zend_signal.c) if test -r "$abs_srcdir/Zend/zend_objects.c"; then PHP_ADD_SOURCES(Zend, zend_objects.c zend_object_handlers.c zend_objects_API.c \ diff -ur -x CVS --new-file php-5.3.0-HEAD/ext/standard/info.c php-5.3.0-alarms/ext/standard/info.c --- php-5.3.0-HEAD/ext/standard/info.c 2008-07-08 16:24:22.000000000 -0700 +++ php-5.3.0-alarms/ext/standard/info.c 2008-07-08 16:24:58.000000000 -0700 @@ -514,6 +514,12 @@ php_info_print_table_row(2, "Zend Memory Manager", is_zend_mm(TSRMLS_C) ? "enabled" : "disabled" ); +#ifdef ZEND_SIGNALS + php_info_print_table_row(2, "Zend Signal Handling", "enabled" ); +#else + php_info_print_table_row(2, "Zend Signal Handling", "disabled" ); +#endif + #ifdef ZEND_MULTIBYTE php_info_print_table_row(2, "Zend Multibyte Support", "enabled"); #else diff -ur -x CVS --new-file php-5.3.0-HEAD/main/main.c php-5.3.0-alarms/main/main.c --- php-5.3.0-HEAD/main/main.c 2008-06-25 05:18:36.000000000 -0700 +++ php-5.3.0-alarms/main/main.c 2008-07-08 16:23:44.000000000 -0700 @@ -1304,6 +1304,10 @@ zend_activate(TSRMLS_C); sapi_activate(TSRMLS_C); +#ifdef ZEND_SIGNALS + zend_signal_activate(TSRMLS_C); +#endif + if (PG(max_input_time) == -1) { zend_set_timeout(EG(timeout_seconds), 1); } else { @@ -1427,6 +1431,10 @@ } zend_try { + zend_unset_timeout(TSRMLS_C); + } zend_end_try(); + + zend_try { int i; for (i = 0; i < NUM_TRACK_VARS; i++) { @@ -1450,9 +1458,11 @@ shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); } zend_end_try(); +#ifdef ZEND_SIGNALS zend_try { - zend_unset_timeout(TSRMLS_C); + zend_signal_deactivate(TSRMLS_C); } zend_end_try(); +#endif } /* }}} */ @@ -1494,13 +1504,18 @@ sapi_send_headers(TSRMLS_C); } zend_end_try(); - /* 5. Call all extensions RSHUTDOWN functions */ + /* 5. Reset max_execution_time (no longer executing php code after response sent) */ + zend_try { + zend_unset_timeout(TSRMLS_C); + } zend_end_try(); + + /* 6. Call all extensions RSHUTDOWN functions */ if (PG(modules_activated)) { zend_deactivate_modules(TSRMLS_C); php_free_shutdown_functions(TSRMLS_C); } - /* 6. Destroy super-globals */ + /* 7. Destroy super-globals */ zend_try { int i; @@ -1511,7 +1526,7 @@ } } zend_end_try(); - /* 6.5 free last error information */ + /* 7.5 free last error information */ if (PG(last_error_message)) { free(PG(last_error_message)); PG(last_error_message) = NULL; @@ -1521,33 +1536,35 @@ PG(last_error_file) = NULL; } - /* 7. Shutdown scanner/executor/compiler and restore ini entries */ + /* 8. Shutdown scanner/executor/compiler and restore ini entries */ zend_deactivate(TSRMLS_C); - /* 8. Call all extensions post-RSHUTDOWN functions */ + /* 9. Call all extensions post-RSHUTDOWN functions */ zend_try { zend_post_deactivate_modules(TSRMLS_C); } zend_end_try(); - /* 9. SAPI related shutdown (free stuff) */ + /* 10. SAPI related shutdown (free stuff) */ zend_try { sapi_deactivate(TSRMLS_C); } zend_end_try(); - /* 10. Destroy stream hashes */ + /* 11. Destroy stream hashes */ zend_try { php_shutdown_stream_hashes(TSRMLS_C); } zend_end_try(); - /* 11. Free Willy (here be crashes) */ + /* 12. Free Willy (here be crashes) */ zend_try { shutdown_memory_manager(CG(unclean_shutdown) || !report_memleaks, 0 TSRMLS_CC); } zend_end_try(); - /* 12. Reset max_execution_time */ + /* 13. Reset zend signals */ +#ifdef ZEND_SIGNALS zend_try { - zend_unset_timeout(TSRMLS_C); + zend_signal_deactivate(TSRMLS_C); } zend_end_try(); +#endif #ifdef PHP_WIN32 if (PG(com_initialized)) { @@ -1723,8 +1740,10 @@ zuf.write_function = php_body_write_wrapper; zuf.fopen_function = php_fopen_wrapper_for_zend; zuf.message_handler = php_message_handler_for_zend; +#ifndef ZEND_SIGNALS zuf.block_interruptions = sapi_module.block_interruptions; zuf.unblock_interruptions = sapi_module.unblock_interruptions; +#endif zuf.get_configuration_directive = php_get_configuration_directive_for_zend; zuf.ticks_function = php_run_ticks; zuf.on_timeout = php_on_timeout; diff -ur -x CVS --new-file php-5.3.0-HEAD/main/SAPI.c php-5.3.0-alarms/main/SAPI.c --- php-5.3.0-HEAD/main/SAPI.c 2008-03-18 14:42:50.000000000 -0700 +++ php-5.3.0-alarms/main/SAPI.c 2008-05-28 01:50:28.000000000 -0700 @@ -76,6 +76,10 @@ SAPI_API void sapi_startup(sapi_module_struct *sf) { +#ifdef ZEND_SIGNALS + zend_signal_startup(); +#endif + sf->ini_entries = NULL; sapi_module = *sf; diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/Makefile.am php-5.3.0-alarms/Zend/Makefile.am --- php-5.3.0-HEAD/Zend/Makefile.am 2008-03-16 14:05:33.000000000 -0700 +++ php-5.3.0-alarms/Zend/Makefile.am 2008-05-28 01:50:28.000000000 -0700 @@ -17,7 +17,7 @@ zend_objects_API.c zend_ts_hash.c zend_stream.c \ zend_default_classes.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c \ - zend_strtod.c + zend_strtod.c zend_signal.c libZend_la_LDFLAGS = libZend_la_LIBADD = @ZEND_EXTRA_LIBS@ diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/zend.c php-5.3.0-alarms/Zend/zend.c --- php-5.3.0-HEAD/Zend/zend.c 2008-06-29 01:21:34.000000000 -0700 +++ php-5.3.0-alarms/Zend/zend.c 2008-07-03 18:02:00.000000000 -0700 @@ -634,8 +634,10 @@ } zend_stream_open_function = utility_functions->stream_open_function; zend_message_dispatcher_p = utility_functions->message_handler; +#ifndef ZEND_SIGNALS zend_block_interruptions = utility_functions->block_interruptions; zend_unblock_interruptions = utility_functions->unblock_interruptions; +#endif zend_get_configuration_directive_p = utility_functions->get_configuration_directive; zend_ticks_function = utility_functions->ticks_function; zend_on_timeout = utility_functions->on_timeout; diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/zend_execute_API.c php-5.3.0-alarms/Zend/zend_execute_API.c --- php-5.3.0-HEAD/Zend/zend_execute_API.c 2008-06-05 11:50:29.000000000 -0700 +++ php-5.3.0-alarms/Zend/zend_execute_API.c 2008-07-03 18:02:01.000000000 -0700 @@ -1567,7 +1567,7 @@ # ifdef HAVE_SETITIMER { struct itimerval t_r; /* timeout requested */ - sigset_t sigset; + int signo; if(seconds) { t_r.it_value.tv_sec = seconds; @@ -1576,25 +1576,27 @@ # ifdef __CYGWIN__ setitimer(ITIMER_REAL, &t_r, NULL); } - if(reset_signals) { - signal(SIGALRM, zend_timeout); - sigemptyset(&sigset); - sigaddset(&sigset, SIGALRM); - } + signo = SIGALRM; # else setitimer(ITIMER_PROF, &t_r, NULL); } - if(reset_signals) { - signal(SIGPROF, zend_timeout); - sigemptyset(&sigset); - sigaddset(&sigset, SIGPROF); - } + signo = SIGPROF; # endif - if(reset_signals) { + + if (reset_signals) { +# ifdef ZEND_SIGNALS + zend_signal(signo, zend_timeout); +# else + sigset_t sigset; + + signal(signo, zend_timeout); + sigemptyset(&sigset); + sigaddset(&sigset, signo); sigprocmask(SIG_UNBLOCK, &sigset, NULL); +# endif } } -# endif +# endif /* HAVE_SETITIMER */ #endif } /* }}} */ @@ -1614,8 +1616,14 @@ #ifdef __CYGWIN__ setitimer(ITIMER_REAL, &no_timeout, NULL); +# ifdef ZEND_SIGNALS + zend_signal(SIGALRM, SIG_DFL); +# endif #else setitimer(ITIMER_PROF, &no_timeout, NULL); +# ifdef ZEND_SIGNALS + zend_signal(SIGPROF, SIG_DFL); +# endif #endif } # endif diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/zend.h php-5.3.0-alarms/Zend/zend.h --- php-5.3.0-HEAD/Zend/zend.h 2008-06-27 11:44:39.000000000 -0700 +++ php-5.3.0-alarms/Zend/zend.h 2008-07-03 18:02:00.000000000 -0700 @@ -471,8 +471,10 @@ int (*write_function)(const char *str, uint str_length); FILE *(*fopen_function)(const char *filename, char **opened_path); void (*message_handler)(long message, void *data); +#ifndef ZEND_SIGNALS void (*block_interruptions)(void); void (*unblock_interruptions)(void); +#endif int (*get_configuration_directive)(char *name, uint name_length, zval *contents); void (*ticks_function)(int ticks); void (*on_timeout)(int seconds TSRMLS_DC); @@ -609,8 +611,10 @@ extern ZEND_API int (*zend_printf)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2); extern ZEND_API zend_write_func_t zend_write; extern ZEND_API FILE *(*zend_fopen)(const char *filename, char **opened_path); +#ifndef ZEND_SIGNALS extern ZEND_API void (*zend_block_interruptions)(void); extern ZEND_API void (*zend_unblock_interruptions)(void); +#endif extern ZEND_API void (*zend_ticks_function)(int ticks); extern ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 4, 0); extern void (*zend_on_timeout)(int seconds TSRMLS_DC); @@ -633,8 +637,15 @@ #define ZEND_UV(name) (zend_uv.name) +#ifndef ZEND_SIGNALS #define HANDLE_BLOCK_INTERRUPTIONS() if (zend_block_interruptions) { zend_block_interruptions(); } #define HANDLE_UNBLOCK_INTERRUPTIONS() if (zend_unblock_interruptions) { zend_unblock_interruptions(); } +#else +#include "zend_signal.h" + +#define HANDLE_BLOCK_INTERRUPTIONS() SIGG(depth)++; +#define HANDLE_UNBLOCK_INTERRUPTIONS() if (SIG_UNEXPECTED((--SIGG(depth))==SIGG(blocked))) { zend_signal_handler_unblock(); } +#endif BEGIN_EXTERN_C() ZEND_API void zend_message_dispatcher(long message, void *data); diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/Zend.m4 php-5.3.0-alarms/Zend/Zend.m4 --- php-5.3.0-HEAD/Zend/Zend.m4 2008-06-29 01:21:34.000000000 -0700 +++ php-5.3.0-alarms/Zend/Zend.m4 2008-07-03 18:02:00.000000000 -0700 @@ -384,8 +384,33 @@ AC_CHECK_FUNCS(mremap) + +AC_ARG_ENABLE(zend-signals, +[ --enable-zend-signals EXPERIMENTAL: Disable old style alarm blocking and enable zend signal handling],[ + ZEND_SIGNALS=$enableval +],[ + ZEND_SIGNALS=no ]) +dnl Do not allow ZEND_SIGNALS in ZTS build +if test "$ZEND_MAINTAINER_ZTS" = "no" && test "$ZEND_SIGNALS" = "yes"; then + AC_CHECK_FUNC(sigaction, [ + AC_DEFINE(ZEND_SIGNALS, 1, [Use zend signal handling]) + AC_DEFINE(HAVE_SIGACTION, 1, [Whether sigaction() is available]) + ], [ + ZEND_SIGNALS=no + ]) + if test "$ZEND_SIGNALS" = "yes"; then + CFLAGS="$CFLAGS -DZEND_SIGNALS" + fi +else + ZEND_SIGNALS=no +fi + +AC_MSG_CHECKING(whether to enable zend signal handling) +AC_MSG_RESULT($ZEND_SIGNALS) + +]) AC_DEFUN([LIBZEND_CPLUSPLUS_CHECKS],[ diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/zend_signal.c php-5.3.0-alarms/Zend/zend_signal.c --- php-5.3.0-HEAD/Zend/zend_signal.c 1969-12-31 16:00:00.000000000 -0800 +++ php-5.3.0-alarms/Zend/zend_signal.c 2008-07-03 18:22:26.000000000 -0700 @@ -0,0 +1,305 @@ +/* + +----------------------------------------------------------------------+ + | Zend Signal Handling | + +----------------------------------------------------------------------+ + | Copyright (c) 2008 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. | + +----------------------------------------------------------------------+ + | Authors: Lucas Nealan | + +----------------------------------------------------------------------+ + + This software was contributed to PHP by Facebook Inc. in 2008. + + Future revisions and derivatives of this source code must acknowledge + Facebook Inc. as the original contributor of this module by leaving + this note intact in the source code. + + All other licensing and usage conditions are those of the PHP Group. +*/ + + /* $Id$ */ + +#define _GNU_SOURCE +#include + +#include "zend.h" +#include "zend_globals.h" + +#ifdef HAVE_SIGNAL_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef ZEND_SIGNALS + +#include "zend_signal.h" + +#ifdef ZTS +ZEND_API int zend_globals_id; +#else +zend_signal_globals_t zend_signal_globals; +#endif + +static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context); +static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void*), sigset_t *sigmask); + +/* {{{ zend_signal_handler_defer + * Blocks signals if in critical section */ +void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context) +{ + int errno_save = errno; + + if (SIGG(active)) { + if (SIGG(depth) == 0) { /* try to handle signal */ + if (SIGG(blocked) != -1) { /* inverse */ + SIGG(blocked) = -1; /* signal is not blocked */ + } + if (SIGG(running) == 0) { + SIGG(running) = 1; + zend_signal_handler(signo, siginfo, context); + SIGG(running) = 0; + + zend_signal_t *dsigp; + while ((dsigp = zend_llist_remove_tail(&SIGG(pending)))) { + zend_signal_handler(dsigp->signo, dsigp->siginfo, dsigp->context); + } + } else { + } + } else { /* delay signal handling */ + SIGG(blocked) = 0; /* signal is blocked */ + zend_signal_t dsig = { signo, siginfo, context }; + zend_llist_prepend_element(&SIGG(pending), &dsig); + } + } else { + /* need to just run handler if we're inactive and getting a signal */ + zend_signal_handler(signo, siginfo, context); + } + + errno = errno_save; +} /* }}} */ + +/* {{{ zend_signal_handler_unblock + * Handle deferred signal from HANDLE_UNBLOCK_ALARMS */ +void zend_signal_handler_unblock() +{ + if (SIGG(active)) { + zend_signal_t *zend_signal = zend_llist_remove_tail(&SIGG(pending)); + zend_signal_handler_defer(zend_signal->signo, zend_signal->siginfo, zend_signal->context); + } +} + +/* {{{ zend_signal_handler + * Call the previously registered handler for a signal + */ +static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) +{ + int errno_save = errno; + struct sigaction sa = {{0}}; + sigset_t sigset; + zend_signal_entry_t p_sig = SIGG(handlers).prev[signo-1]; + + if (p_sig.handler == SIG_DFL) { /* ignore SIG_IGN, raise default handler */ + if (sigaction(signo, NULL, &sa) == 0) { + sa.sa_handler = SIG_DFL; + sigemptyset(&sa.sa_mask); + + sigemptyset(&sigset); + sigaddset(&sigset, signo); + + if (sigaction(signo, &sa, NULL) == 0) { + /* throw away any blocked signals */ + sigprocmask(SIG_UNBLOCK, &sigset, NULL); + raise(signo); + } + } + } else { + if (p_sig.siginfo) { + (*(void (*)(int, siginfo_t*, void*))p_sig.handler)(signo, siginfo, context); + } else { + (*(void (*)(int))p_sig.handler)(signo); + } + } + + errno = errno_save; +} /* }}} */ + +/* {{{ zend_signal + * Register a signal handler that will be deferred in critical sections */ +int zend_signal(int signo, void (*handler)(int)) +{ + struct sigaction sa = {{0}}; + zend_signal_entry_t p_sig = { signo, 0, handler }; + sigset_t sigset; + int i; + + if (SIGG(handlers).prev[signo-1].handler == NULL) { + SIGG(handlers).installed++; + } + SIGG(handlers).prev[signo-1] = p_sig; + + sa.sa_flags = 0; + sa.sa_flags |= SA_SIGINFO; + sa.sa_handler = (void *)zend_signal_handler_defer; + + /* block already registered zend signals plus the new one */ + if (handler == SIG_ERR || handler == SIG_DFL || handler == SIG_IGN) { + sigdelset(&SIGG(sigmask), signo); + } else { + sigaddset(&SIGG(sigmask), signo); + } + sa.sa_mask = SIGG(sigmask); + + if (sigaction(signo, &sa, NULL) < 0) { + zend_error(E_ERROR, "Error installing signal handler for %d", signo); + return FAILURE; + } + + /* throw away any blocked signals */ + sigemptyset(&sigset); + sigaddset(&sigset, signo); + sigprocmask(SIG_UNBLOCK, &sigset, NULL); + + /* try to block zend_signal_handler_defer even on user installed handlers */ + for(i=1; i <= NSIG-1; i++) { + if (SIGG(handlers).prev[i].handler != NULL) { + sigaction(i, NULL, &sa); + if (sa.sa_sigaction == zend_signal_handler_defer) { + if (handler == SIG_ERR || handler == SIG_DFL || handler == SIG_IGN) { + sigdelset(&sa.sa_mask, signo); + } else { + sigaddset(&sa.sa_mask, signo); + } + sigaction(i, &sa, NULL); + } + } + } + + return SUCCESS; +} + +/* {{{ zend_signal_register + * Set a handler for a previously installed signal and save so we can + * callback when handled + */ +static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void*), sigset_t *sigmask) +{ + struct sigaction sa = {{0}}; + zend_signal_entry_t p_sig = {0}; + + if (sigaction(signo, NULL, &sa) == 0) { + if ((void*)sa.sa_handler == (void*)handler) { + return FAILURE; + } + + p_sig.signo = signo; + p_sig.siginfo = ((sa.sa_flags & SA_SIGINFO) == SA_SIGINFO); + p_sig.handler = (void *)sa.sa_handler; + + if (SIGG(handlers).prev[signo-1].handler == NULL) { + SIGG(handlers).installed++; + } + SIGG(handlers).prev[signo-1] = p_sig; + + /* don't inherit flags if already set */ + sa.sa_flags = 0; + sa.sa_flags |= SA_SIGINFO; /* we'll use a siginfo handler */ + + if (sigmask) { + sa.sa_mask = *sigmask; + } else { + sigemptyset(&sa.sa_mask); + } + + sa.sa_handler = (void*)handler; + + if (sigaction(signo, &sa, NULL) < 0) { + zend_error(E_ERROR, "Error installing signal handler for %d", signo); + } + + return SUCCESS; + } + return FAILURE; +} /* }}} */ + +/* {{{ zend_signal_activate + * Install our signal handlers, per request */ +void zend_signal_activate(TSRMLS_D) +{ + int x, sigs[] = { SIGALRM, SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2 }; + + sigemptyset(&SIGG(sigmask)); + for (x=0; x < sizeof(sigs) / sizeof(*sigs); x++) { + sigaddset(&SIGG(sigmask), sigs[x]); + } + for (x=0; x < sizeof(sigs) / sizeof(*sigs); x++) { + zend_signal_register(sigs[x], zend_signal_handler_defer, &SIGG(sigmask)); + } + + SIGG(active) = 1; +} /* }}} */ + +/* {{{ zend_signal_deactivate + * */ +void zend_signal_deactivate(TSRMLS_D) +{ +#if ZEND_DEBUG + if (SIGG(depth) != 0) { + zend_output_debug_string(0, "zend_signal: shutdown with non-zero signal depth (%d)", SIGG(depth)); + } +#endif + + SIGNAL_BEGIN_CRITICAL(); + SIGG(active) = 0; + SIGG(running) = 0; + SIGG(blocked) = -1; + SIGG(depth) = 0; + zend_llist_destroy(&SIGG(pending)); + + SIGNAL_END_CRITICAL(); +} + +static void zend_signal_globals_ctor(zend_signal_globals_t *zend_signal_globals TSRMLS_DC) +{ + memset(zend_signal_globals, 0, sizeof(*zend_signal_globals)); + zend_signal_globals->blocked = -1; + zend_llist_init(&zend_signal_globals->pending, sizeof(zend_signal_t), NULL, 1); /* persistant for alloc safety */ +} + +#ifdef ZTS +static void zend_signal_globals_dtor(zend_signal_globals_t *zend_signal_globals TSRMLS_DC) +{ + zend_signal_globals->blocked = -1; +} +#endif + +/* {{{ zend_signal_startup + * alloc zend signal globals */ +void zend_signal_startup() +{ +#ifdef ZTS + ts_allocate_id(&zend_signal_globals_id, sizeof(zend_signal_globals_t), (ts_allocate_ctor) zend_signal_globals_ctor, (ts_allocate_dtor) zend_signal_globals_dtor); +#else + zend_signal_globals_ctor(&zend_signal_globals); +#endif +} + +#endif /* ZEND_SIGNALS */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker + * vim<600: expandtab sw=4 ts=4 sts=4 + */ diff -ur -x CVS --new-file php-5.3.0-HEAD/Zend/zend_signal.h php-5.3.0-alarms/Zend/zend_signal.h --- php-5.3.0-HEAD/Zend/zend_signal.h 1969-12-31 16:00:00.000000000 -0800 +++ php-5.3.0-alarms/Zend/zend_signal.h 2008-05-28 01:50:28.000000000 -0700 @@ -0,0 +1,99 @@ +/* + +----------------------------------------------------------------------+ + | APC | + +----------------------------------------------------------------------+ + | Copyright (c) 2008 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. | + +----------------------------------------------------------------------+ + | Authors: Lucas Nealan | + +----------------------------------------------------------------------+ + + */ + +/* $Id$ */ + +#ifndef ZEND_SIGNAL_H +#define ZEND_SIGNAL_H + +#ifdef HAVE_SIGNAL_H +#include +#endif + +#ifndef NSIG +#define NSIG 65 +#endif + +/* Signal structs */ +typedef struct _zend_signal_entry_t { + int signo; /* signal number */ + int siginfo; /* siginfo style handler calling */ + void* handler; /* signal handler or context */ +} zend_signal_entry_t; + +typedef struct _zend_signal_info_t { + int installed; /* How many signals we've installed handles for */ + zend_signal_entry_t prev[NSIG]; /* Previous signal handlers */ +} zend_signal_info_t; + +typedef struct _zend_signal_t { + int signo; + siginfo_t *siginfo; + void* context; +} zend_signal_t; + +/* Signal Globals */ +typedef struct _zend_signal_globals_t { + int depth; + int blocked; /* 0==TRUE, -1==FALSE */ + int running; /* in signal handler execution */ + int active; /* internal signal handling is enabled */ + sigset_t sigmask; + zend_signal_info_t handlers; + zend_llist pending; +} zend_signal_globals_t; + +#ifdef ZTS +# define SIGG(v) TSRMG(zend_signal_globals_id, zend_signal_globals_t *, v) +BEGIN_EXTERN_C() +ZEND_API extern int zend_signal_globals_id; +END_EXTERN_C() +# define SIGNAL_BEGIN_CRITICAL() +# define SIGNAL_END_CRITICAL() +#else /* ZTS */ +# define SIGG(v) (zend_signal_globals.v) +extern ZEND_API zend_signal_globals_t zend_signal_globals; +# define SIGNAL_BEGIN_CRITICAL() sigset_t oldmask; \ + sigprocmask(SIG_BLOCK, &SIGG(sigmask), &oldmask); +# define SIGNAL_END_CRITICAL() sigprocmask(SIG_SETMASK, &oldmask, NULL); +#endif /* not ZTS */ + +#if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) +# define SIG_UNEXPECTED(condition) __builtin_expect(condition, 0) +#else +# define SIG_UNEXPECTED(condition) (condition) +#endif + +void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context); +void zend_signal_handler_unblock(); +void zend_signal_activate(TSRMLS_D); +void zend_signal_deactivate(TSRMLS_D); +void zend_signal_startup(); +int zend_signal(int signo, void (*handler)(int)); + +#endif /* ZEND_SIGNAL_H */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker + * vim<600: expandtab sw=4 ts=4 sts=4 + */