ID: 15125 User updated by: [EMAIL PROTECTED] Old Summary: pnctl_signal does not handle class's as callbacks - patch included Reported By: [EMAIL PROTECTED] Status: Open Bug Type: *Extensibility Functions Operating System: Linux PHP Version: 4.0CVS-2002-01-20 New Comment:
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(¶m); 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, ¶m 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(); Previous Comments: ------------------------------------------------------------------------ [2002-01-20 11:23:35] [EMAIL PROTECTED] Ok, forgot to modify your hash table... - this one doesnt segfault :) 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 20 Jan 2002 16:20:50 -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); + php_error(E_WARNING, "%s: argument 2 is not a callable function or method", get_active_function_name(TSRMLS_C)); 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)); ------------------------------------------------------------------------ [2002-01-20 10:57:11] [EMAIL PROTECTED] Have a go with this.- I'm assuming that zend_is_callable works like php_gtk_is_callable... regards alan 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 20 Jan 2002 15:51:50 -0000 @@ -483,14 +483,8 @@ 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); + php_error(E_WARNING, "%s: argument 2 is not a callable function or method", get_active_function_name(TSRMLS_C)); efree(func_name); RETURN_FALSE; } ------------------------------------------------------------------------ Edit this bug report at http://bugs.php.net/?id=15125&edit=1 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]