diff options
author | Zeev Suraski <zeev@php.net> | 2000-04-29 10:20:40 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2000-04-29 10:20:40 +0000 |
commit | 8aac6e7d3d94b2a180de0c13ea4fa6aee1a02605 (patch) | |
tree | 4480c65a36f915e79f77b537e64796ae3eda0656 /Zend | |
parent | 0118f62195a1a5a4c0c4ce0313e9deb201dfaa15 (diff) | |
download | php-git-8aac6e7d3d94b2a180de0c13ea4fa6aee1a02605.tar.gz |
- Add zend_llist_apply_with_arguments()
- Add a message handler to the extensions
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_extensions.c | 22 | ||||
-rw-r--r-- | Zend/zend_extensions.h | 5 | ||||
-rw-r--r-- | Zend/zend_llist.c | 13 | ||||
-rw-r--r-- | Zend/zend_llist.h | 6 |
4 files changed, 45 insertions, 1 deletions
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index de5df36157..f7f7c76ced 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -123,6 +123,8 @@ int zend_register_extension(zend_extension *new_extension, DL_HANDLE handle) extension = *new_extension; extension.handle = handle; + zend_extension_dispatch_message(ZEND_EXTMSG_NEW_EXTENSION, &extension); + zend_llist_add_element(&zend_extensions, &extension); zend_append_version_info(&extension); @@ -168,6 +170,26 @@ void zend_extension_dtor(zend_extension *extension) } +static void zend_extension_message_dispatcher(zend_extension *extension, int num_args, va_list args) +{ + int message; + void *arg; + + if (num_args!=2) { + return; + } + message = va_arg(args, int); + arg = va_arg(args, void *); + extension->message_handler(message, arg); +} + + +ZEND_API void zend_extension_dispatch_message(int message, void *arg) +{ + zend_llist_apply_with_arguments(&zend_extensions, (llist_apply_with_args_func_t) zend_extension_message_dispatcher, 2, message, arg); +} + + ZEND_API int zend_get_resource_handle(zend_extension *extension) { if (last_resource_number<ZEND_MAX_RESERVED_RESOURCES) { diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 83cbfabd20..9053e3fe02 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -47,6 +47,8 @@ struct _zend_extension { void (*activate)(); void (*deactivate)(); + void (*message_handler)(int message, void *arg); + void (*op_array_handler)(zend_op_array *op_array); void (*statement_handler)(zend_op_array *op_array); @@ -71,6 +73,9 @@ struct _zend_extension { ZEND_API int zend_get_resource_handle(zend_extension *extension); +ZEND_API void zend_extension_dispatch_message(int message, void *arg); + +#define ZEND_EXTMSG_NEW_EXTENSION 1 #ifdef ZTS #define ZTS_V 1 diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index 0a7755f25b..5c10eee433 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -196,6 +196,19 @@ ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *d } +ZEND_API void zend_llist_apply_with_arguments(zend_llist *l, llist_apply_with_args_func_t func, int num_args, ...) +{ + zend_llist_element *element; + va_list args; + + va_start(args, num_args); + for (element=l->head; element; element=element->next) { + func(element->data, num_args, args); + } + va_end(args); +} + + ZEND_API int zend_llist_count(zend_llist *l) { zend_llist_element *element; diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h index 805859a8ff..0ca19b7abe 100644 --- a/Zend/zend_llist.h +++ b/Zend/zend_llist.h @@ -38,7 +38,10 @@ typedef struct _zend_llist { zend_llist_element *traverse_ptr; } zend_llist; -typedef int (*llist_compare_func_t) (const zend_llist_element *, const zend_llist_element *); +typedef int (*llist_compare_func_t)(const zend_llist_element *, const zend_llist_element *); +typedef void(*llist_apply_with_arg_func_t)(void *data, void *arg); +typedef void(*llist_apply_with_args_func_t)(void *data, int num_args, va_list args); + typedef zend_llist_element* zend_llist_position; BEGIN_EXTERN_C() @@ -52,6 +55,7 @@ ZEND_API void zend_llist_remove_tail(zend_llist *l); ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src); ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data)); ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg); +ZEND_API void zend_llist_apply_with_arguments(zend_llist *l, llist_apply_with_args_func_t func, int num_args, ...); ZEND_API int zend_llist_count(zend_llist *l); ZEND_API void zend_llist_sort(zend_llist *l, llist_compare_func_t comp_func); |