summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-07-30 16:13:52 +0000
committerZeev Suraski <zeev@php.net>2003-07-30 16:13:52 +0000
commit2fd4ffce1782c49c5bf583115e2b2ecbf126950d (patch)
tree9fb2c2e5a027a715448145b19c4b163fab9414c4
parent81c5e49a68ab6d320be7f40edcd8baf46a78e185 (diff)
downloadphp-git-2fd4ffce1782c49c5bf583115e2b2ecbf126950d.tar.gz
Add exec_finished() callback for modules - this is the last place where the
modules may touch the symbol table reliably
-rw-r--r--Zend/zend.c15
-rw-r--r--Zend/zend.h6
-rw-r--r--Zend/zend_API.c3
-rw-r--r--Zend/zend_API.h2
-rw-r--r--Zend/zend_compile.h4
-rw-r--r--Zend/zend_modules.h5
6 files changed, 30 insertions, 5 deletions
diff --git a/Zend/zend.c b/Zend/zend.c
index e3b5bc8a86..9bd65bb9fd 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -804,6 +804,21 @@ void zend_deactivate(TSRMLS_D)
}
+static int exec_done_cb(zend_module_entry *module TSRMLS_DC)
+{
+ if (module->exec_finished_func) {
+ module->exec_finished_func();
+ }
+ return 0;
+}
+
+
+void zend_exec_finished(TSRMLS_D)
+{
+ zend_hash_apply(&module_registry, (apply_func_t) exec_done_cb TSRMLS_CC);
+}
+
+
BEGIN_EXTERN_C()
ZEND_API void zend_message_dispatcher(long message, void *data)
{
diff --git a/Zend/zend.h b/Zend/zend.h
index 6fe55a05c3..0fd5576610 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -444,6 +444,12 @@ ZEND_API void zend_print_flat_zval_r(zval *expr TSRMLS_DC);
ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC);
ZEND_API void zend_output_debug_string(zend_bool trigger_break, char *format, ...);
+void zend_activate(TSRMLS_D);
+void zend_deactivate(TSRMLS_D);
+void zend_activate_modules(TSRMLS_D);
+void zend_deactivate_modules(TSRMLS_D);
+void zend_exec_finished(TSRMLS_D);
+
#if ZEND_DEBUG
#define Z_DBG(expr) (expr)
#else
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index a9722a6c54..3b22dde873 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1274,8 +1274,9 @@ void module_destructor(zend_module_entry *module)
if (module->type == MODULE_TEMPORARY) {
zend_clean_module_rsrc_dtors(module->module_number TSRMLS_CC);
clean_module_constants(module->module_number TSRMLS_CC);
- if (module->request_shutdown_func)
+ if (module->request_shutdown_func) {
module->request_shutdown_func(module->type, module->module_number TSRMLS_CC);
+ }
}
if (module->module_started && module->module_shutdown_func) {
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 9a7271033c..b3606305c5 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -48,6 +48,7 @@ BEGIN_EXTERN_C()
#define ZEND_MODULE_SHUTDOWN_N(module) zm_shutdown_##module
#define ZEND_MODULE_ACTIVATE_N(module) zm_activate_##module
#define ZEND_MODULE_DEACTIVATE_N(module) zm_deactivate_##module
+#define ZEND_MODULE_EXEC_FINISHED_N(module) zm_exec_finished_##module
#define ZEND_MODULE_INFO_N(module) zm_info_##module
/* Declaration macros */
@@ -55,6 +56,7 @@ BEGIN_EXTERN_C()
#define ZEND_MODULE_SHUTDOWN_D(module) int ZEND_MODULE_SHUTDOWN_N(module)(SHUTDOWN_FUNC_ARGS)
#define ZEND_MODULE_ACTIVATE_D(module) int ZEND_MODULE_ACTIVATE_N(module)(INIT_FUNC_ARGS)
#define ZEND_MODULE_DEACTIVATE_D(module) int ZEND_MODULE_DEACTIVATE_N(module)(SHUTDOWN_FUNC_ARGS)
+#define ZEND_MODULE_EXEC_FINISHED_D(module) int ZEND_MODULE_EXEC_FINISHED_N(module)(void)
#define ZEND_MODULE_INFO_D(module) void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)
#define ZEND_GET_MODULE(name) \
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 64fceee26d..7bd5db3b90 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -249,11 +249,13 @@ void zend_init_compiler_data_structures(TSRMLS_D);
extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
+/*
void zend_activate(TSRMLS_D);
void zend_deactivate(TSRMLS_D);
void zend_activate_modules(TSRMLS_D);
void zend_deactivate_modules(TSRMLS_D);
-
+void zend_exec_finished(TSRMLS_D);
+*/
ZEND_API int lex_scan(zval *zendlval TSRMLS_DC);
void startup_scanner(TSRMLS_D);
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 188fcf5078..572f52c315 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -48,7 +48,7 @@ ZEND_API extern unsigned char third_arg_force_ref[];
#define STANDARD_MODULE_PROPERTIES_EX 0, 0, 0, NULL, 0
#define STANDARD_MODULE_PROPERTIES \
- NULL, NULL, STANDARD_MODULE_PROPERTIES_EX
+ NULL, STANDARD_MODULE_PROPERTIES_EX
#define NO_VERSION_YET NULL
@@ -72,8 +72,7 @@ struct _zend_module_entry {
int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
char *version;
- int (*global_startup_func)(void);
- int (*global_shutdown_func)(void);
+ int (*exec_finished_func)(void);
int globals_id;
int module_started;
unsigned char type;