]> granicus.if.org Git - php/commitdiff
MFH: Added pcntl_signal_dispatch()
authorArnaud Le Blanc <lbarnaud@php.net>
Tue, 29 Jul 2008 16:46:11 +0000 (16:46 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Tue, 29 Jul 2008 16:46:11 +0000 (16:46 +0000)
[DOC] pcntl_signal_dispatch() allows to dispatch pending signals to registered
signal handler functions on-demand. This allows to use pcntl_signal() without
ticks.

ext/pcntl/pcntl.c
ext/pcntl/php_pcntl.h
ext/pcntl/tests/pcntl_signal_dispatch.phpt [new file with mode: 0644]

index f1c8ec8c93f810908695817889a446da624408de..9dce4b7ff4938ac854c42ef6a308cc5c0ad24134 100755 (executable)
@@ -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;
index f7e5efe9fd2a3fdb6ae02d603178fbc4bae8c66b..cd6d82e1f0ecad1ae2b6e36c91854ea0f94dda39 100644 (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);
diff --git a/ext/pcntl/tests/pcntl_signal_dispatch.phpt b/ext/pcntl/tests/pcntl_signal_dispatch.phpt
new file mode 100644 (file)
index 0000000..82e0a78
--- /dev/null
@@ -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!