CVS update: php3

From: Date: Wed, 27 Jan 1999 19:18:12 +0000
Subject: CVS update: php3
Groups: php.dev 
Request: Send a blank email to php-dev+get-3744@lists.php.net to get a copy of this message
Date: Wednesday January 27, 1999 @ 14:18 Author: rasmus Update of /repository/php3 In directory asf:/u/temp/cvs-serv8695 Modified Files: internal_functions.c main.c php.h Log Message: Heads up! The following completely cleans up the aborted connection mess that never worked reliably. Thanks to Thies C. Arntzen for getting me started on this. There was a bit more to it than his initial work. As discussed with some Apache guys, we are now checking the return status of each write and set a global connection_aborted variable if the number of bytes written do not match the number of bytes sent. A user-level connection_aborted() function has been added. This returns true if the connection was aborted, obviously. This is useful in a user-level registered shutdown function if something needs to be cleaned up differently if the remote user hit his stop button. Index: php3/internal_functions.c diff -c php3/internal_functions.c:1.341 php3/internal_functions.c:1.342 *** php3/internal_functions.c:1.341 Tue Jan 26 17:32:35 1999 --- php3/internal_functions.c Wed Jan 27 14:18:09 1999 *************** *** 29,35 **** */ ! /* $Id: internal_functions.c,v 1.341 1999/01/26 22:32:35 timothy Exp $ */ #ifdef THREAD_SAFE #include "tls.h" --- 29,35 ---- */ ! /* $Id: internal_functions.c,v 1.342 1999/01/27 19:18:09 rasmus Exp $ */ #ifdef THREAD_SAFE #include "tls.h" *************** *** 165,173 **** {"PDF", pdf_module_ptr}, {"FDF", fdf_module_ptr}, {"System V semaphores", sysvsem_module_ptr}, ! {"System V shared memory", sysvshm_module_ptr}, {"DAV", phpdav_module_ptr}, ! {"MCK Crypt", mckcrypt_module_ptr}, {NULL, NULL} }; --- 165,173 ---- {"PDF", pdf_module_ptr}, {"FDF", fdf_module_ptr}, {"System V semaphores", sysvsem_module_ptr}, ! {"System V shared memory", sysvshm_module_ptr}, {"DAV", phpdav_module_ptr}, ! {"MCK Crypt", mckcrypt_module_ptr}, {NULL, NULL} }; Index: php3/main.c diff -c php3/main.c:1.491 php3/main.c:1.492 *** php3/main.c:1.491 Fri Jan 15 12:19:58 1999 --- php3/main.c Wed Jan 27 14:18:10 1999 *************** *** 29,35 **** +----------------------------------------------------------------------+ */ ! /* $Id: main.c,v 1.491 1999/01/15 17:19:58 zeev Exp $ */ /* #define CRASH_DETECTION */ --- 29,35 ---- +----------------------------------------------------------------------+ */ ! /* $Id: main.c,v 1.492 1999/01/27 19:18:10 rasmus Exp $ */ /* #define CRASH_DETECTION */ *************** *** 99,104 **** --- 99,106 ---- void *gLock; /*mutex variable */ #ifndef THREAD_SAFE + int connection_aborted; + int abort_shutdown_pending; int error_reporting, tmp_error_reporting; int initialized; /* keep track of which resources were successfully initialized */ static int module_initialized = 0; *************** *** 170,181 **** #if APACHE void php3_apache_puts(const char *s) { TLS_VARS; if (GLOBAL(php3_rqst)) { ! rputs(s, GLOBAL(php3_rqst)); } else { fputs(s, stdout); } --- 172,199 ---- #if APACHE + int php3_apache_write(const void *a, int n) + { + int ret; + TLS_VARS; + + ret = rwrite(a,n,GLOBAL(php3_rqst)); + + if (ret != n) { + GLOBAL(connection_aborted) = 1; + } + + return ret; + } + void php3_apache_puts(const char *s) { TLS_VARS; if (GLOBAL(php3_rqst)) { ! if (rputs(s, GLOBAL(php3_rqst)) == -1) { ! GLOBAL(connection_aborted) = 1; ! } } else { fputs(s, stdout); } *************** *** 186,192 **** TLS_VARS; if (GLOBAL(php3_rqst)) { ! rputc(c, GLOBAL(php3_rqst)); } else { fputc(c, stdout); } --- 204,212 ---- TLS_VARS; if (GLOBAL(php3_rqst)) { ! if (rputc(c, GLOBAL(php3_rqst)) != c) { ! GLOBAL(connection_aborted) = 1; ! } } else { fputc(c, stdout); } *************** *** 422,429 **** return 0; } #if APACHE ! if (php3_rqst->connection->aborted) { GLOBAL(shutdown_requested) = ABNORMAL_SHUTDOWN; return 0; } #endif --- 442,456 ---- return 0; } #if APACHE ! if ((php3_rqst->connection->aborted || GLOBAL(connection_aborted)) && !GLOBAL(abort_shutdown_pending)) { GLOBAL(shutdown_requested) = ABNORMAL_SHUTDOWN; + /* + abort_shutdown_pending is used to tell phplex() that even though we know that the + remote client is no longer listening to us, we still want it to continue in case + we come back here as part of a registered shutdown function. Without this flag + a user-registered shutdown function would never run to completion. + */ + GLOBAL(abort_shutdown_pending) = 1; return 0; } #endif *************** *** 457,463 **** TLS_VARS; if (!GLOBAL(shutdown_requested)) { ! php3_error(E_ERROR, "Maximum execution time of %d seconds exceeded", php3_ini.max_execution_time); /* Now, schedule another alarm. If we're stuck in a code portion that will not go through * phplex() or if the parser is broken, end the process ungracefully */ --- 484,490 ---- TLS_VARS; if (!GLOBAL(shutdown_requested)) { ! php3_error(E_ERROR, "Maximum execution time exceeded"); /* Now, schedule another alarm. If we're stuck in a code portion that will not go through * phplex() or if the parser is broken, end the process ungracefully */ *************** *** 532,537 **** --- 559,570 ---- be. If we use a bound thread and proper masking it should work fine. Is this FIXME a WIN32 problem? Is there no way to do per-thread timers on WIN32? + + Something to keep in mind here is that the SIGPROF itimer + we are currently using is not a real-time timer. It is + only active when the process is in user or kernel space. + ie. a sleep(10); call in a script will not count towards + the timeout limit. -RL */ GLOBAL(max_execution_time) = new_timeout->value.lval; php3_unset_timeout(_INLINE_TLS_VOID); *************** *** 592,597 **** --- 625,632 ---- GLOBAL(shutdown_requested) = 0; GLOBAL(header_is_being_sent) = 0; GLOBAL(php3_track_vars) = php3_ini.track_vars; + GLOBAL(connection_aborted) = 0; + GLOBAL(abort_shutdown_pending) = 0; } if (php3_init_request_info((void *) &php3_ini)) { *************** *** 702,708 **** log_error(log_message, php3_rqst->server); } #endif - php3_call_shutdown_functions(); if (GLOBAL(initialized) & INIT_LIST) { --- 737,742 ---- Index: php3/php.h diff -c php3/php.h:1.42 php3/php.h:1.43 *** php3/php.h:1.42 Fri Jan 1 12:58:51 1999 --- php3/php.h Wed Jan 27 14:18:11 1999 *************** *** 28,34 **** +----------------------------------------------------------------------+ */ ! /* $Id: php.h,v 1.42 1999/01/01 17:58:51 zeev Exp $ */ #ifndef _PHP_H #define _PHP_H --- 28,34 ---- +----------------------------------------------------------------------+ */ ! /* $Id: php.h,v 1.43 1999/01/27 19:18:11 rasmus Exp $ */ #ifndef _PHP_H #define _PHP_H *************** *** 248,257 **** #if APACHE extern PHPAPI void php3_apache_puts(const char *s); extern PHPAPI void php3_apache_putc(char c); # if !defined(COMPILE_DL) # define PUTS(s) php3_apache_puts(s) # define PUTC(c) php3_apache_putc(c) ! # define PHPWRITE(a,n) rwrite((a),(n),GLOBAL(php3_rqst)) # endif #endif --- 248,259 ---- #if APACHE extern PHPAPI void php3_apache_puts(const char *s); extern PHPAPI void php3_apache_putc(char c); + extern PHPAPI int php3_apache_write(const void *a, int n); # if !defined(COMPILE_DL) # define PUTS(s) php3_apache_puts(s) # define PUTC(c) php3_apache_putc(c) ! # define PHPWRITE(a,n) php3_apache_write(a,n) ! /* thies@digicol.de 990119 # define PHPWRITE(a,n) rwrite((a),(n),GLOBAL(php3_rqst)) */ # endif #endif *************** *** 447,452 **** --- 449,456 ---- extern HashTable include_names; extern HashTable *active_symbol_table; extern int phplineno, current_lineno; + extern int connection_aborted; + extern int abort_shutdown_pending; extern int error_reporting,tmp_error_reporting; extern pval *data,globals; extern FunctionState function_state; -- PHP Development Mailing List http://www.php.net/ To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net For help: php-dev-help@lists.php.net

« previous php.dev (#3744) next »