[PHP-DEV] CVS update: php3 From: rasmus (php-dev <email protected>)
Date: 01/27/99

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 <email protected> 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 <email protected>
For help: php-dev-help <email protected>