summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2000-04-29 10:20:40 +0000
committerZeev Suraski <zeev@php.net>2000-04-29 10:20:40 +0000
commit8aac6e7d3d94b2a180de0c13ea4fa6aee1a02605 (patch)
tree4480c65a36f915e79f77b537e64796ae3eda0656 /Zend
parent0118f62195a1a5a4c0c4ce0313e9deb201dfaa15 (diff)
downloadphp-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.c22
-rw-r--r--Zend/zend_extensions.h5
-rw-r--r--Zend/zend_llist.c13
-rw-r--r--Zend/zend_llist.h6
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);