/* {{{ zend_signal_deactivate * */ void zend_signal_deactivate(void) { if (SIGG(check)) { int x; struct sigaction sa = {{0}}; if (SIGG(depth) != 0) { zend_error(E_CORE_WARNING, "zend_signal: shutdown with non-zero blocking depth (%d)", SIGG(depth)); } /* did anyone steal our installed handler */ for (x = 0; x < sizeof(zend_sigs) / sizeof(*zend_sigs); x++) { sigaction(zend_sigs[x], NULL, &sa); if (sa.sa_sigaction != zend_signal_handler_defer) { zend_error(E_CORE_WARNING, "zend_signal: handler was replaced for signal (%d) after startup", zend_sigs[x]); } } } SIGNAL_BEGIN_CRITICAL(); SIGG(active) = 0; SIGG(running) = 0; SIGG(blocked) = 0; SIGG(depth) = 0; SIGNAL_END_CRITICAL(); }
/* {{{ zend_signal_handler_unblock * Handle deferred signal from HANDLE_UNBLOCK_ALARMS */ ZEND_API void zend_signal_handler_unblock(TSRMLS_D) { zend_signal_queue_t *queue; zend_signal_t zend_signal; if (SIGG(active)) { SIGNAL_BEGIN_CRITICAL(); /* procmask to protect handler_defer as if it were called by the kernel */ queue = SIGG(phead); SIGG(phead) = queue->next; zend_signal = queue->zend_signal; queue->next = SIGG(pavail); queue->zend_signal.signo = 0; SIGG(pavail) = queue; zend_signal_handler_defer(zend_signal.signo, zend_signal.siginfo, zend_signal.context); SIGNAL_END_CRITICAL(); } }