]> granicus.if.org Git - php/commitdiff
@Added PHP API for Zend's ticks
authorStig Bakken <ssb@php.net>
Tue, 29 Aug 2000 09:18:48 +0000 (09:18 +0000)
committerStig Bakken <ssb@php.net>
Tue, 29 Aug 2000 09:18:48 +0000 (09:18 +0000)
Added PHP API for registering tick functions.  Ticks is a per-instruction
callback in Zend that allows us to implement cooperative multitasking
within PHP.  Example:

In extension code:

php_add_tick_function(my_tick_func);

void my_tick_func(int count) {
    php_printf("[tick %d]", count);
}

In PHP code:
<?php

declare(ticks = 1) {
    print "there should be two ticks here.\n";
}

?>

main/main.c
main/php_ticks.c
main/php_ticks.h

index 4d0e8e72579f995f762e83677e6e59cc4e07cca1..d62eb8db6a44e9097ee49122528be7685f2c812f 100644 (file)
@@ -757,7 +757,6 @@ int php_global_shutdown_extensions(zend_module_entry **ptr, int count)
        return SUCCESS;
 }
 
-
 int php_module_startup(sapi_module_struct *sf)
 {
        zend_utility_functions zuf;
index c93200c9adebc5bc0dea841aca2e5f34bd444092..e56f0af915e91d56eb29b470b384a801a49ec8b7 100644 (file)
@@ -23,7 +23,7 @@
 
 int php_startup_ticks(PLS_D)
 {
-       zend_llist_init(&PG(tick_functions), sizeof(PG(tick_functions)), NULL, 1);
+       zend_llist_init(&PG(tick_functions), sizeof(void(*)(int)), NULL, 1);
        return SUCCESS;
 }
 
@@ -34,31 +34,33 @@ void php_shutdown_ticks(PLS_D)
 
 static int php_compare_tick_functions(void *elem1, void *elem2)
 {
-       return ((void (*)(int))elem1 == (void (*)(int))elem2);
+       void(*func1)(int);
+       void(*func2)(int);
+       memcpy(&func1, elem1, sizeof(void(*)(int)));
+       memcpy(&func2, elem2, sizeof(void(*)(int)));
+       return (func1 == func2);
 }
 
-PHPAPI int php_add_tick_function(void (*func)(int))
+PHPAPI void php_add_tick_function(void (*func)(int))
 {
        PLS_FETCH();
 
-       zend_llist_add_element(&PG(tick_functions), func);
-
-       return SUCCESS;
+       zend_llist_add_element(&PG(tick_functions), (void *)&func);
 }
 
-PHPAPI int php_remove_tick_function(void (*func)(int))
+PHPAPI void php_remove_tick_function(void (*func)(int))
 {
        PLS_FETCH();
 
        zend_llist_del_element(&PG(tick_functions), func,
                                                   (int(*)(void*,void*))php_compare_tick_functions);
-       return SUCCESS;
 }
 
 static void php_tick_iterator(void *data, void *arg)
 {
        void (*func)(int);
-       func = (void(*)(int))data;
+
+       memcpy(&func, data, sizeof(void(*)(int)));
        func(*((int *)arg));
 }
 
index 078ca3aae2881dfac7092f516e11a13c84837723..1ca461742425ca6c24f16562138af5c5b74e8d16 100644 (file)
 #ifndef PHP_TICKS_H
 #define PHP_TICKS_H
 
-struct _php_tick_function_entry {
-       void (*func)(int count);
-       struct _php_tick_function_entry *next;
-};
-
 int php_startup_ticks(PLS_D);
 void php_shutdown_ticks(PLS_D);
 void php_run_ticks(int count);
-PHPAPI int php_add_tick_function(void (*func)(int count));
-PHPAPI int php_remove_tick_function(void (*func)(int count));
+PHPAPI void php_add_tick_function(void (*func)(int));
+PHPAPI void php_remove_tick_function(void (*func)(int));
 
 #endif