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]