From 1b4d8c0fb616f33dc5386e180b4201fc996014cd Mon Sep 17 00:00:00 2001 From: Stig Bakken Date: Tue, 29 Aug 2000 09:18:48 +0000 Subject: [PATCH] @Added PHP API for Zend's ticks 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: --- main/main.c | 1 - main/php_ticks.c | 20 +++++++++++--------- main/php_ticks.h | 9 ++------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/main/main.c b/main/main.c index 4d0e8e7257..d62eb8db6a 100644 --- a/main/main.c +++ b/main/main.c @@ -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; diff --git a/main/php_ticks.c b/main/php_ticks.c index c93200c9ad..e56f0af915 100644 --- a/main/php_ticks.c +++ b/main/php_ticks.c @@ -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)); } diff --git a/main/php_ticks.h b/main/php_ticks.h index 078ca3aae2..1ca4617424 100644 --- a/main/php_ticks.h +++ b/main/php_ticks.h @@ -21,16 +21,11 @@ #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 -- 2.40.0