- don't set php_errormsg on errors that will cause a zend_bailout().

using zend_hash_update() can make things worse in this situation.
- new function php_register_pre_request_shutdown(). this way modules
  can register callbacks that will be called as soon as execution of
  the script is done but *before* any cleanup (global symbol_table etc)
  has taken place.
This commit is contained in:
Thies C. Arntzen 2000-01-15 13:02:54 +00:00
parent e078a04fd0
commit 3ff75e5b8b
3 changed files with 45 additions and 23 deletions

View File

@ -439,6 +439,19 @@ PHPAPI void php_error(int type, const char *format,...)
} }
} }
} }
switch (type) {
case E_ERROR:
case E_CORE_ERROR:
/*case E_PARSE: the parser would return 1 (failure), we can bail out nicely */
case E_COMPILE_ERROR:
if (module_initialized) {
zend_bailout();
return;
}
break;
}
if (PG(track_errors)) { if (PG(track_errors)) {
pval *tmp; pval *tmp;
@ -455,17 +468,6 @@ PHPAPI void php_error(int type, const char *format,...)
zend_hash_update(EG(active_symbol_table), "php_errormsg", sizeof("php_errormsg"), (void **) & tmp, sizeof(pval *), NULL); zend_hash_update(EG(active_symbol_table), "php_errormsg", sizeof("php_errormsg"), (void **) & tmp, sizeof(pval *), NULL);
} }
switch (type) {
case E_ERROR:
case E_CORE_ERROR:
/*case E_PARSE: the parser would return 1 (failure), we can bail out nicely */
case E_COMPILE_ERROR:
if (module_initialized) {
zend_bailout();
}
break;
}
} }
@ -652,33 +654,51 @@ static void php_message_handler_for_zend(long message, void *data)
} }
} }
static void php_start_post_request_startup(void *data) static void php_start_request_hook(void *data)
{ {
php_post_request_startup *ptr = (php_post_request_startup *) data; php_request_hook *ptr = (php_request_hook *) data;
ptr->func(ptr->userdata); ptr->func(ptr->userdata);
} }
static void php_execute_post_request_startup(PLS_D) static void php_execute_pre_request_shutdown(PLS_D)
{ {
zend_llist_apply(&PG(ll_post_request_startup), php_start_post_request_startup); zend_llist_apply(&PG(ll_pre_request_shutdown), php_start_request_hook);
} }
static void php_destroy_post_request_startup(void) static void php_execute_post_request_startup(PLS_D)
{
zend_llist_apply(&PG(ll_post_request_startup), php_start_request_hook);
}
static void php_destroy_request_hooks(void)
{ {
PLS_FETCH(); PLS_FETCH();
zend_llist_destroy(&PG(ll_pre_request_shutdown));
zend_llist_destroy(&PG(ll_post_request_startup)); zend_llist_destroy(&PG(ll_post_request_startup));
} }
static void php_init_post_request_startup(PLS_D) static void php_init_request_hooks(PLS_D)
{ {
zend_llist_init(&PG(ll_post_request_startup), sizeof(php_post_request_startup), NULL, 0); zend_llist_init(&PG(ll_post_request_startup), sizeof(php_request_hook), NULL, 0);
zend_llist_init(&PG(ll_pre_request_shutdown), sizeof(php_request_hook), NULL, 0);
}
void php_register_pre_request_shutdown(void (*func)(void *), void *userdata)
{
php_request_hook ptr;
PLS_FETCH();
ptr.func = func;
ptr.userdata = userdata;
zend_llist_add_element(&PG(ll_pre_request_shutdown), &ptr);
} }
void php_register_post_request_startup(void (*func)(void *), void *userdata) void php_register_post_request_startup(void (*func)(void *), void *userdata)
{ {
php_post_request_startup ptr; php_request_hook ptr;
PLS_FETCH(); PLS_FETCH();
ptr.func = func; ptr.func = func;
@ -692,7 +712,7 @@ int php_request_startup(CLS_D ELS_DC PLS_DC SLS_DC)
global_lock(); global_lock();
php_output_startup(); php_output_startup();
php_init_post_request_startup(PLS_C); php_init_request_hooks(PLS_C);
#if APACHE #if APACHE
/* /*
@ -772,7 +792,6 @@ void php_request_shutdown(void *dummy)
ELS_FETCH(); ELS_FETCH();
SLS_FETCH(); SLS_FETCH();
php_destroy_post_request_startup();
sapi_send_headers(); sapi_send_headers();
php_end_ob_buffering(SG(request_info).headers_only?0:1); php_end_ob_buffering(SG(request_info).headers_only?0:1);
@ -783,11 +802,11 @@ void php_request_shutdown(void *dummy)
zend_deactivate(CLS_C ELS_CC); zend_deactivate(CLS_C ELS_CC);
sapi_deactivate(SLS_C); sapi_deactivate(SLS_C);
php_destroy_request_hooks();
php_destroy_request_info(NULL); php_destroy_request_info(NULL);
shutdown_memory_manager(CG(unclean_shutdown), 0); shutdown_memory_manager(CG(unclean_shutdown), 0);
php_unset_timeout(); php_unset_timeout();
#if CGI_BINARY #if CGI_BINARY
fflush(stdout); fflush(stdout);
if(request_info.php_argv0) { if(request_info.php_argv0) {
@ -1275,6 +1294,7 @@ PHPAPI void php_execute_script(zend_file_handle *primary_file CLS_DC ELS_DC PLS_
EG(active_op_array) = EG(main_op_array); EG(active_op_array) = EG(main_op_array);
php_execute_post_request_startup(PLS_C); php_execute_post_request_startup(PLS_C);
zend_execute(EG(main_op_array) ELS_CC); zend_execute(EG(main_op_array) ELS_CC);
php_execute_pre_request_shutdown(PLS_C);
} }
} }

View File

@ -320,6 +320,7 @@ int mergesort(void *base, size_t nmemb, register size_t size, int (*cmp) (const
extern PHPAPI int _php_error_log(int opt_err,char *message,char *opt,char *headers); extern PHPAPI int _php_error_log(int opt_err,char *message,char *opt,char *headers);
PHPAPI void php_register_post_request_startup(void (*func)(void *), void *userdata); PHPAPI void php_register_post_request_startup(void (*func)(void *), void *userdata);
PHPAPI void php_register_pre_request_shutdown(void (*func)(void *), void *userdata);
PHPAPI int cfg_get_long(char *varname, long *result); PHPAPI int cfg_get_long(char *varname, long *result);
PHPAPI int cfg_get_double(char *varname, double *result); PHPAPI int cfg_get_double(char *varname, double *result);

View File

@ -97,13 +97,14 @@ struct _php_core_globals {
unsigned char header_is_being_sent; unsigned char header_is_being_sent;
zend_llist ll_post_request_startup; zend_llist ll_post_request_startup;
zend_llist ll_pre_request_shutdown;
}; };
typedef struct { typedef struct {
void (*func)(void *); void (*func)(void *);
void *userdata; void *userdata;
} php_post_request_startup; } php_request_hook;
#endif /* _PHP_GLOBALS_H */ #endif /* _PHP_GLOBALS_H */