You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Dean Gaudet <dg...@hyperreal.com> on 1997/06/24 01:56:23 UTC

cvs commit: apache/src CHANGES PORTING alloc.c conf.h http_main.c httpd.h util.c

dgaudet     97/06/23 16:56:22

  Modified:    src       CHANGES PORTING alloc.c conf.h http_main.c httpd.h
                        util.c
  Log:
  Create fd slack to keep enough low numbered descriptors open for per request
  data.
  
  Reviewed by:	Marc, Jim
  
  Revision  Changes    Path
  1.289     +13 -0     apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.288
  retrieving revision 1.289
  diff -C3 -r1.288 -r1.289
  *** CHANGES	1997/06/23 11:36:56	1.288
  --- CHANGES	1997/06/23 23:56:15	1.289
  ***************
  *** 6,11 ****
  --- 6,24 ----
    
      *) Added NT support [Ben Laurie and Ambarish Malpani <am...@valicert.com>]
    
  + Changes with Apache 1.2.1
  + 
  +   *) Attempt to work around problems with third party libraries that do not
  +      handle high numbered descriptors (examples include bind, and
  +      solaris libc).  On all systems apache attempts to keep all permanent
  +      descriptors above 15 (called the low slack line).  Solaris users
  +      can also benefit from adding -DHIGH_SLACK_LINE=256 to EXTRA_CFLAGS
  +      which keeps all non-FILE * descriptors above 255.  On all systems
  +      this should make supporting large numbers of vhosts with many open
  +      log files more feasible.  If this causes trouble please report it,
  +      you can disable this workaround by adding -DNO_SLACK to EXTRA_CFLAGS.
  +      [Dean Gaudet] various PRs
  + 
    Changes with Apache 1.2
    
    Changes with Apache 1.2b11
  
  
  
  1.5       +3 -0      apache/src/PORTING
  
  Index: PORTING
  ===================================================================
  RCS file: /export/home/cvs/apache/src/PORTING,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -C3 -r1.4 -r1.5
  *** PORTING	1997/02/25 21:04:42	1.4
  --- PORTING	1997/06/23 23:56:15	1.5
  ***************
  *** 227,232 ****
  --- 227,235 ----
          NO_LINGCLOSE:
           Do not use Apache's soft, "lingering" close feature to
           terminate connections.
  +       NO_SLACK:
  +        Do not use the "slack" fd feature which requires a working fcntl
  +        F_DUPFD.
    --
    
      MISC #DEFINES:
  
  
  
  1.33      +6 -3      apache/src/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/alloc.c,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -C3 -r1.32 -r1.33
  *** alloc.c	1997/06/16 18:42:47	1.32
  --- alloc.c	1997/06/23 23:56:16	1.33
  ***************
  *** 58,65 ****
     * rst --- 4/95 --- 6/95
     */
    
  ! #include "conf.h"
  ! #include "alloc.h"
    #include "multithread.h"
    
    #include <stdarg.h>
  --- 58,64 ----
     * rst --- 4/95 --- 6/95
     */
    
  ! #include "httpd.h"
    #include "multithread.h"
    
    #include <stdarg.h>
  ***************
  *** 832,838 ****
      block_alarms();
      fd = open(name, flg, mode);
      save_errno = errno;
  !   if (fd >= 0) note_cleanups_for_fd (a, fd);
      unblock_alarms();
      errno = save_errno;
      return fd;
  --- 831,840 ----
      block_alarms();
      fd = open(name, flg, mode);
      save_errno = errno;
  !   if (fd >= 0) {
  !     fd = ap_slack (fd, AP_SLACK_HIGH);
  !     note_cleanups_for_fd (a, fd);
  !   }
      unblock_alarms();
      errno = save_errno;
      return fd;
  ***************
  *** 884,889 ****
  --- 886,892 ----
        desc = open(name, baseFlag | O_APPEND | O_CREAT,
    		modeFlags);
        if (desc >= 0) {
  +       desc = ap_slack(desc, AP_SLACK_LOW);
          fd = fdopen(desc, mode);
        }
      } else {
  
  
  
  1.102     +1 -0      apache/src/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/conf.h,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -C3 -r1.101 -r1.102
  *** conf.h	1997/06/16 20:04:51	1.101
  --- conf.h	1997/06/23 23:56:16	1.102
  ***************
  *** 73,78 ****
  --- 73,79 ----
    extern void GETPRIVMODE();
    extern void GETUSERMODE();
    extern char *inet_ntoa();
  + #define NO_SLACK
    
    #elif defined(SUNOS4)
    #define HAVE_GMTOFF
  
  
  
  1.158     +2 -0      apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.157
  retrieving revision 1.158
  diff -C3 -r1.157 -r1.158
  *** http_main.c	1997/06/21 22:27:11	1.157
  --- http_main.c	1997/06/23 23:56:17	1.158
  ***************
  *** 1819,1824 ****
  --- 1819,1826 ----
            exit(1);
        }
    
  +     s = ap_slack(s, AP_SLACK_HIGH);
  + 
        note_cleanups_for_socket(pconf, s); /* arrange to close on exec or restart */
        
    #ifndef MPE
  
  
  
  1.114     +29 -0     apache/src/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/httpd.h,v
  retrieving revision 1.113
  retrieving revision 1.114
  diff -C3 -r1.113 -r1.114
  *** httpd.h	1997/06/15 19:22:28	1.113
  --- httpd.h	1997/06/23 23:56:18	1.114
  ***************
  *** 271,276 ****
  --- 271,277 ----
    #define DECLINED -1		/* Module declines to handle */
    #define OK 0			/* Module has handled this stage. */
    
  + 
    /* ----------------------- HTTP Status Codes  ------------------------- */
    
    #define RESPONSE_CODES 38
  ***************
  *** 714,716 ****
  --- 715,745 ----
    unsigned long get_virthost_addr (const char *hostname, unsigned short *port);
    
    extern time_t restart_time;
  + 
  + /*
  +  * Apache tries to keep all of its long term filehandles (such as log files,
  +  * and sockets) above this number.  This is to workaround problems in many
  +  * third party libraries that are compiled with a small FD_SETSIZE.  There
  +  * should be no reason to lower this, because it's only advisory.  If a file
  +  * can't be allocated above this number then it will remain in the "slack"
  +  * area.
  +  *
  +  * Only the low slack line is used by default.  If HIGH_SLACK_LINE is defined
  +  * then an attempt is also made to keep all non-FILE * files above the high
  +  * slack line.  This is to work around a Solaris C library limitation, where it
  +  * uses an unsigned char to store the file descriptor.
  +  */
  + #ifndef LOW_SLACK_LINE
  + #define LOW_SLACK_LINE	15
  + #endif
  + /* #define HIGH_SLACK_LINE	255 */
  + 
  + /*
  +  * The ap_slack() function takes a fd, and tries to move it above the indicated
  +  * line.  It returns an fd which may or may not have moved above the line, and
  +  * never fails.  If the high line was requested and it fails it will also try
  +  * the low line.
  +  */
  + int ap_slack (int fd, int line);
  + #define AP_SLACK_LOW	1
  + #define AP_SLACK_HIGH	2
  
  
  
  1.55      +27 -0     apache/src/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/util.c,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -C3 -r1.54 -r1.55
  *** util.c	1997/06/22 20:35:26	1.54
  --- util.c	1997/06/23 23:56:18	1.55
  ***************
  *** 1334,1336 ****
  --- 1334,1363 ----
        return (p);
    }
    #endif
  + 
  + 
  + int ap_slack (int fd, int line)
  + {
  + #if !defined(F_DUPFD) || defined(NO_SLACK)
  +     return fd;
  + #else
  +     int new_fd;
  + 
  + #ifdef HIGH_SLACK_LINE
  +     if (line == AP_SLACK_HIGH) {
  + 	new_fd = fcntl (fd, F_DUPFD, HIGH_SLACK_LINE);
  + 	if (new_fd != -1) {
  + 	    close (fd);
  + 	    return new_fd;
  + 	}
  +     }
  + #endif
  +     /* otherwise just assume line == AP_SLACK_LOW */
  +     new_fd = fcntl (fd, F_DUPFD, LOW_SLACK_LINE);
  +     if (new_fd == -1) {
  +       return fd;
  +     }
  +     close (fd);
  +     return new_fd;
  + #endif
  + }