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(&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();

 






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]

Reply via email to