Add exec_finished() callback for modules - this is the last place where the

modules may touch the symbol table reliably
This commit is contained in:
Zeev Suraski 2003-07-30 16:13:52 +00:00
parent 81c5e49a68
commit 2fd4ffce17
6 changed files with 30 additions and 5 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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) {

View File

@ -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) \

View File

@ -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);

View File

@ -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;