php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | |
Patch return-previous-handler for PCNTL related Bug #72409Patch version 2016-06-18 08:14 UTC Return to Bug #72409 | Download this patchThis patch is obsolete Obsoleted by patches: This patch renders other patches obsolete Obsolete patches: Patch Revisions:
Developer: dave@mudsite.comFrom 650a4f3709844111bc9f61453697b0896b712bdd Mon Sep 17 00:00:00 2001 From: David Walker <dave@mudsite.com> Date: Sat, 18 Jun 2016 01:13:25 -0600 Subject: [PATCH] Have pcntl_signal() return previously set handlers --- ext/pcntl/pcntl.c | 17 ++++++++++++++--- ext/pcntl/tests/pcntl_signal.phpt | 7 ++++++- test.php | 13 +++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 test.php diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 5592b31..e50913d 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -959,7 +959,7 @@ PHP_FUNCTION(pcntl_exec) Assigns a system signal handler to a PHP function */ PHP_FUNCTION(pcntl_signal) { - zval *handle; + zval *handle, *prev; zend_string *func_name; zend_long signo; zend_bool restart_syscalls = 1; @@ -1009,9 +1009,17 @@ PHP_FUNCTION(pcntl_signal) } zend_string_release(func_name); + /* If we had a previous handler, save and return it */ + if ((prev = zend_hash_index_find(&PCNTL_G(php_signal_table), signo)) != NULL) { + ZVAL_DEREF(prev); + ZVAL_COPY(return_value, prev); + } + /* Add the function name to our signal table */ if (zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle)) { - if (Z_REFCOUNTED_P(handle)) Z_ADDREF_P(handle); + if (Z_REFCOUNTED_P(handle)) { + Z_ADDREF_P(handle); + } } if (php_signal4(signo, pcntl_signal_handler, (int) restart_syscalls, 1) == (Sigfunc *)SIG_ERR) { @@ -1019,7 +1027,10 @@ PHP_FUNCTION(pcntl_signal) php_error_docref(NULL, E_WARNING, "Error assigning signal"); RETURN_FALSE; } - RETURN_TRUE; + + if (Z_ISNULL_P(return_value)) { + RETURN_TRUE; + } } /* }}} */ diff --git a/ext/pcntl/tests/pcntl_signal.phpt b/ext/pcntl/tests/pcntl_signal.phpt index a521b00..5eb58b3 100644 --- a/ext/pcntl/tests/pcntl_signal.phpt +++ b/ext/pcntl/tests/pcntl_signal.phpt @@ -5,7 +5,10 @@ pcntl_signal() <?php if (!extension_loaded("posix")) die("skip posix extension not available"); ?> --FILE-- <?php -pcntl_signal(SIGTERM, function($signo){ +function test() {} + +pcntl_signal(SIGTERM, 'test'); +$prev = pcntl_signal(SIGTERM, function($signo){ echo "signal dispatched\n"; }); posix_kill(posix_getpid(), SIGTERM); @@ -17,6 +20,7 @@ pcntl_signal(SIGUSR1, function($signo, $siginfo){ posix_kill(posix_getpid(), SIGUSR1); pcntl_signal_dispatch(); +var_dump($prev); var_dump(pcntl_signal()); var_dump(pcntl_signal(SIGALRM, SIG_IGN)); var_dump(pcntl_signal(-1, -1)); @@ -31,6 +35,7 @@ echo "ok\n"; --EXPECTF-- signal dispatched got signal from %d +string(4) "test" Warning: pcntl_signal() expects at least 2 parameters, 0 given in %s NULL diff --git a/test.php b/test.php new file mode 100644 index 0000000..ee71390 --- /dev/null +++ b/test.php @@ -0,0 +1,13 @@ +<?php +function foo() { +} +function bar() { +} + +pcntl_signal(SIGUSR1, 'foo'); +$func = pcntl_signal(SIGUSR1, 'bar'); +var_dump($func); + +pcntl_signal(SIGUSR1, function($signo) {}); +$func = pcntl_signal(SIGUSR1, 'bar'); +var_dump($func); -- 2.8.1.217.ge6ac6e1 |
Copyright © 2001-2025 The PHP Group All rights reserved. |
Last updated: Fri Jan 03 05:01:29 2025 UTC |