MFH: Added pcntl_signal_dispatch()

[DOC] pcntl_signal_dispatch() allows to dispatch pending signals to registered
signal handler functions on-demand. This allows to use pcntl_signal() without
ticks.
This commit is contained in:
Arnaud Le Blanc 2008-07-29 16:46:11 +00:00
parent b6cca30211
commit 204fcbe5d3
3 changed files with 40 additions and 3 deletions

View File

@ -134,6 +134,7 @@ const zend_function_entry pcntl_functions[] = {
PHP_FE(pcntl_waitpid, arginfo_pcntl_waitpid)
PHP_FE(pcntl_wait, arginfo_pcntl_wait)
PHP_FE(pcntl_signal, arginfo_pcntl_signal)
PHP_FE(pcntl_signal_dispatch, arginfo_pcntl_void)
PHP_FE(pcntl_wifexited, arginfo_pcntl_wifexited)
PHP_FE(pcntl_wifstopped, arginfo_pcntl_wifstopped)
PHP_FE(pcntl_wifsignaled, arginfo_pcntl_wifsignaled)
@ -173,7 +174,7 @@ ZEND_GET_MODULE(pcntl)
#endif
static void pcntl_signal_handler(int);
static void pcntl_tick_handler();
static void pcntl_signal_dispatch();
void php_register_signal_constants(INIT_FUNC_ARGS)
{
@ -262,7 +263,7 @@ PHP_RINIT_FUNCTION(pcntl)
PHP_MINIT_FUNCTION(pcntl)
{
php_register_signal_constants(INIT_FUNC_ARGS_PASSTHRU);
php_add_tick_function(pcntl_tick_handler);
php_add_tick_function(pcntl_signal_dispatch);
return SUCCESS;
}
@ -644,6 +645,15 @@ PHP_FUNCTION(pcntl_signal)
}
/* }}} */
/* {{{ proto bool pcntl_signal_dispatch()
Dispatch signals to signal handlers */
PHP_FUNCTION(pcntl_signal_dispatch)
{
pcntl_signal_dispatch();
RETURN_TRUE;
}
/* }}} */
#ifdef HAVE_GETPRIORITY
/* {{{ proto int pcntl_getpriority([int pid [, int process_identifier]])
Get the priority of any process */
@ -747,7 +757,7 @@ static void pcntl_signal_handler(int signo)
PCNTL_G(tail) = psig;
}
void pcntl_tick_handler()
void pcntl_signal_dispatch()
{
zval *param, **handle, *retval;
struct php_pcntl_pending_signal *queue, *next;

View File

@ -44,6 +44,7 @@ PHP_FUNCTION(pcntl_wexitstatus);
PHP_FUNCTION(pcntl_wtermsig);
PHP_FUNCTION(pcntl_wstopsig);
PHP_FUNCTION(pcntl_signal);
PHP_FUNCTION(pcntl_signal_dispatch);
PHP_FUNCTION(pcntl_exec);
#ifdef HAVE_GETPRIORITY
PHP_FUNCTION(pcntl_getpriority);

View File

@ -0,0 +1,26 @@
--TEST--
pcnt_signal_dispatch()
--SKIPIF--
<?php
if (!extension_loaded("pcntl")) print "skip";
if (!function_exists("pcntl_signal")) print "skip pcntl_signal() not available";
if (!function_exists("pcntl_signal_dispatch")) print "skip pcntl_signal_dispatch() not available";
if (!function_exists("posix_kill")) print "skip posix_kill() not available";
if (!function_exists("posix_getpid")) print "skip posix_getpid() not available";
?>
--FILE--
<?php
pcntl_signal(SIGTERM, function ($signo) { echo "Signal handler called!\n"; });
echo "Start!\n";
posix_kill(posix_getpid(), SIGTERM);
$i = 0; // dummy
pcntl_signal_dispatch();
echo "Done!\n";
?>
--EXPECTF--
Start!
Signal handler called!
Done!