diff options
author | Arnaud Le Blanc <lbarnaud@php.net> | 2008-07-29 16:46:11 +0000 |
---|---|---|
committer | Arnaud Le Blanc <lbarnaud@php.net> | 2008-07-29 16:46:11 +0000 |
commit | 204fcbe5d3ffb4a9c1383e39f7549b8326801894 (patch) | |
tree | 06674159670abd5a6167d2be1bb22c4b0285e740 /ext/pcntl | |
parent | b6cca302116e9c3e1f8ef5d77699c05b94226de7 (diff) | |
download | php-git-204fcbe5d3ffb4a9c1383e39f7549b8326801894.tar.gz |
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.
Diffstat (limited to 'ext/pcntl')
-rwxr-xr-x | ext/pcntl/pcntl.c | 16 | ||||
-rw-r--r-- | ext/pcntl/php_pcntl.h | 1 | ||||
-rw-r--r-- | ext/pcntl/tests/pcntl_signal_dispatch.phpt | 26 |
3 files changed, 40 insertions, 3 deletions
diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index f1c8ec8c93..9dce4b7ff4 100755 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -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; diff --git a/ext/pcntl/php_pcntl.h b/ext/pcntl/php_pcntl.h index f7e5efe9fd..cd6d82e1f0 100644 --- a/ext/pcntl/php_pcntl.h +++ b/ext/pcntl/php_pcntl.h @@ -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); diff --git a/ext/pcntl/tests/pcntl_signal_dispatch.phpt b/ext/pcntl/tests/pcntl_signal_dispatch.phpt new file mode 100644 index 0000000000..82e0a78f15 --- /dev/null +++ b/ext/pcntl/tests/pcntl_signal_dispatch.phpt @@ -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! |