#15125 [Fbk->NoF]: pnctl_signal does not handle class's as callbacks - patch included

From: Date: Tue, 06 Aug 2002 05:00:12 +0000
Subject: #15125 [Fbk->NoF]: pnctl_signal does not handle class's as callbacks - patch included
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-16056@lists.php.net to get a copy of this message
ID: 15125 Updated by: php-bugs@lists.php.net Reported By: alan_k@php.net -Status: Feedback +Status: No Feedback Bug Type: *Extensibility Functions Operating System: Linux PHP Version: 4.0CVS-2002-01-20 New Comment: No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". Previous Comments: ------------------------------------------------------------------------ [2002-07-05 01:37:53] alan_k@php.net I will look at this soon promise... ------------------------------------------------------------------------ [2002-07-05 01:00:06] php-bugs@lists.php.net No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2002-06-04 06:49:19] mfischer@php.net Alan, can you send a diff -u to php-dev@ against latest CVS ? ------------------------------------------------------------------------ [2002-03-30 18:16:52] me@murpheous.com This is really irritating... Tried the patch/fix provided, to no avail! :( Tested in 4.1.2 and also latest 4.2 public RC (30/03/2002). Simpler test scenario... Doesnt work.. no errors, no callbacks :( Also tried setting class vars from outside class, e.g: pcntl_signal(SIGTERM, array(&$signal, "display_signal")); after defining class.. no good either! :( <? class signalClass { function display_signal($signo) { echo "** $signo **\n"; flush(); exit(); } function define_signals() { pcntl_signal(SIGTERM, array(&$this, "display_signal")); pcntl_signal(SIGHUP, array(&$this, "display_signal")); pcntl_signal(SIGINT, array(&$this, "display_signal")); } } $signal = new signalClass(); $signal->define_signals(); while(1) { // do something here.. sleep(1); } ?> But this works as expected.. :( <? function display_signal($signo) { echo "** $signo **\n"; flush(); exit(); } pcntl_signal(SIGTERM, "display_signal"); pcntl_signal(SIGHUP, "display_signal"); pcntl_signal(SIGINT, "display_signal"); while(1) { // do something here.. sleep(1); } ?> ------------------------------------------------------------------------ [2002-01-20 22:50:26] alan_k@php.net this is a tested :) patch, eg. it appears to work, sample text-class-pcntl.php included at bottom Index: pcntl.c =================================================================== RCS file: /repository/php4/ext/pcntl/pcntl.c,v retrieving revision 1.18 diff -u -r1.18 pcntl.c --- pcntl.c 4 Jan 2002 14:08:25 -0000 1.18 +++ pcntl.c 21 Jan 2002 03:45:58 -0000 @@ -483,21 +483,15 @@ RETURN_TRUE; } - if (Z_TYPE_PP(handle)!=IS_STRING) { - php_error(E_WARNING, "Invalid type specified for handle argument in %s", get_active_function_name(TSRMLS_C)); - RETURN_FALSE; - } - - convert_to_string_ex(handle); /* Just in case */ - if (!zend_is_callable(*handle, 0, &func_name)) { - php_error(E_WARNING, "%s: %s is not a callable function name error", get_active_function_name(TSRMLS_C), func_name); + if (!zend_is_callable(*handle, 0, &func_name)) { + php_error(E_WARNING, "%s: Argument is not a callable function or method", get_active_function_name(TSRMLS_C), func_name); efree(func_name); RETURN_FALSE; } efree(func_name); /* Add the function name to our signal table */ - zend_hash_index_update(&PCNTL_G(php_signal_table), Z_LVAL_PP(signo), Z_STRVAL_PP(handle), (Z_STRLEN_PP(handle) + 1) * sizeof(char), NULL); + zend_hash_index_update(&PCNTL_G(php_signal_table), Z_LVAL_PP(signo), &handle, sizeof(zval *), NULL); if (php_signal(Z_LVAL_PP(signo), pcntl_signal_handler)==SIG_ERR) { php_error(E_WARNING, "Error assigning singal in %s", get_active_function_name(TSRMLS_C)); @@ -613,22 +606,22 @@ /* Allocate */ MAKE_STD_ZVAL(param); - MAKE_STD_ZVAL(call_name); + MAKE_STD_ZVAL(retval); /* Traverse through our signal queue and call the appropriate php functions */ for (element=(&PCNTL_G(php_signal_queue))->head; element; element=element->next) { long *signal_num=(long *)&element->data; - if (zend_hash_index_find(&PCNTL_G(php_signal_table), *signal_num, (void *) &func_name)==FAILURE) { + if (zend_hash_index_find(&PCNTL_G(php_signal_table), *signal_num, (void *) &call_name)==FAILURE) { continue; } convert_to_long_ex(&param); convert_to_string_ex(&call_name); ZVAL_LONG(param, *signal_num); - ZVAL_STRING(call_name, func_name, 0); + /* Call php singal handler - Note that we do not report errors, and we ignore the return value */ call_user_function(EG(function_table), NULL, call_name, retval, 1, &param TSRMLS_CC); } /* Clear */ zend_llist_clean(&PCNTL_G(php_signal_queue)); ------ test-class-pcntl.php #!/opt/devel/php4/php -q <? dl("pcntl.so"); class test { function alarm_handle($signal){ if ($signal==SIGALRM) print "Caught SIGALRM!!!\n"; } function usr1_handle($signal){ if ($signal==SIGUSR1) print "Caught SIGUSR1!!!\n"; } function start() { //$options=NULL; //$status=NULL; print "This test will demonstrate a fork followed by ipc via signals.\n"; $pid=pcntl_fork(); if ($pid==0) { pcntl_signal(SIGUSR1, array(&$this,"usr1_handle")); pcntl_signal(SIGALRM, array(&$this,"alarm_handle")); print "Child: Waiting for alarm.....\n"; sleep(100); print "Child: Waiting for usr1......\n"; sleep(100); print "Child: Resetting Alarm handler to Ignore....\n"; pcntl_signal(SIGALRM, SIG_IGN); sleep(10); print "Done\n"; } else { print "Parent: Waiting 10 seconds....\n"; sleep(10); print "Parent: Sending SIGALRM to Child\n"; posix_kill($pid,SIGALRM); sleep(1); print "Parent: Senging SIGUSR1 to Child\n"; posix_kill($pid,SIGUSR1); sleep(1); print "Parent: Sending SIGALRM to Child\n"; @pcntl_waitpid($pid, &$status, $options); } } } $test = new test(); $test->start(); ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/15125 -- Edit this bug report at http://bugs.php.net/?id=15125&edit=1

« previous php.bugs (#16056) next »