dgaudet     97/06/26 18:47:53

  Modified:    src       Tag: APACHE_1_2_X  CHANGES PORTING alloc.c conf.h
                        http_config.c http_config.h  http_main.c httpd.h
                        util.c
  Log:
  Add the slack fd code, and the reordering of log/socket opening.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.286.2.2 +18 -1     apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.286.2.1
  retrieving revision 1.286.2.2
  diff -C3 -r1.286.2.1 -r1.286.2.2
  *** CHANGES   1997/06/24 00:11:10     1.286.2.1
  --- CHANGES   1997/06/27 01:47:43     1.286.2.2
  ***************
  *** 1,5 ****
    Changes with Apache 1.2.1
  !   
      *) pregsub had an off-by-1 in its error checking code. [Alexei Kosut]
    
    Changes with Apache 1.2
  --- 1,22 ----
    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
  ! 
  !   *) Related to the last entry, network sockets are now opened before
  !      log files are opened.  The only known case where this can cause
  !      problems is under Solaris with many virtualhosts and many Listen
  !      directives.  But using -DHIGH_SLACK_LINE=256 described above will
  !      work around this problem.  [Dean Gaudet]
  ! 
      *) pregsub had an off-by-1 in its error checking code. [Alexei Kosut]
    
    Changes with Apache 1.2
  
  
  
  1.4.2.1   +3 -0      apache/src/PORTING
  
  Index: PORTING
  ===================================================================
  RCS file: /export/home/cvs/apache/src/PORTING,v
  retrieving revision 1.4
  retrieving revision 1.4.2.1
  diff -C3 -r1.4 -r1.4.2.1
  *** PORTING   1997/02/25 21:04:42     1.4
  --- PORTING   1997/06/27 01:47:44     1.4.2.1
  ***************
  *** 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.28.2.1  +6 -3      apache/src/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/alloc.c,v
  retrieving revision 1.28
  retrieving revision 1.28.2.1
  diff -C3 -r1.28 -r1.28.2.1
  *** alloc.c   1997/05/27 04:14:20     1.28
  --- alloc.c   1997/06/27 01:47:44     1.28.2.1
  ***************
  *** 58,65 ****
     * rst --- 4/95 --- 6/95
     */
    
  ! #include "conf.h"
  ! #include "alloc.h"
    
    #include <stdarg.h>
    
  --- 58,64 ----
     * rst --- 4/95 --- 6/95
     */
    
  ! #include "httpd.h"
    
    #include <stdarg.h>
    
  ***************
  *** 801,807 ****
      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;
  --- 800,809 ----
      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;
  ***************
  *** 846,851 ****
  --- 848,854 ----
        desc = open(name, baseFlag | O_APPEND | O_CREAT,
                S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
        if (desc >= 0) {
  +       desc = ap_slack(desc, AP_SLACK_LOW);
          fd = fdopen(desc, mode);
        }
      } else {
  
  
  
  1.99.2.1  +1 -0      apache/src/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/conf.h,v
  retrieving revision 1.99
  retrieving revision 1.99.2.1
  diff -C3 -r1.99 -r1.99.2.1
  *** conf.h    1997/06/04 07:03:11     1.99
  --- conf.h    1997/06/27 01:47:45     1.99.2.1
  ***************
  *** 73,78 ****
  --- 73,79 ----
    extern void GETPRIVMODE();
    extern void GETUSERMODE();
    extern char *inet_ntoa();
  + #define NO_SLACK
    
    #elif defined(SUNOS4)
    #define HAVE_GMTOFF
  
  
  
  1.49.2.1  +9 -3      apache/src/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.c,v
  retrieving revision 1.49
  retrieving revision 1.49.2.1
  diff -C3 -r1.49 -r1.49.2.1
  *** http_config.c     1997/05/15 23:39:20     1.49
  --- http_config.c     1997/06/27 01:47:45     1.49.2.1
  ***************
  *** 1077,1083 ****
    server_rec *read_config(pool *p, pool *ptemp, char *confname)
    {
        server_rec *s = init_server_config(p);
  -     module *m;
        
        init_config_globals(p);
        
  --- 1077,1082 ----
  ***************
  *** 1089,1100 ****
        
        fixup_virtual_hosts (p, s);
        
        for (m = top_module; m; m = m->next)
            if (m->init)
            (*m->init) (s, p);
  -     
  -     return s;
    }
    
    /********************************************************************
     * Configuration directives are restricted in terms of where they may
  --- 1088,1106 ----
        
        fixup_virtual_hosts (p, s);
        
  +     return s;
  + }
  +     
  + 
  + void init_modules(pool *p, server_rec *s)
  + {
  +     module *m;
  + 
        for (m = top_module; m; m = m->next)
            if (m->init)
            (*m->init) (s, p);
    }
  + 
    
    /********************************************************************
     * Configuration directives are restricted in terms of where they may
  
  
  
  1.29.2.1  +1 -0      apache/src/http_config.h
  
  Index: http_config.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.h,v
  retrieving revision 1.29
  retrieving revision 1.29.2.1
  diff -C3 -r1.29 -r1.29.2.1
  *** http_config.h     1997/05/27 04:41:49     1.29
  --- http_config.h     1997/06/27 01:47:45     1.29.2.1
  ***************
  *** 261,266 ****
  --- 261,267 ----
    /* For http_main.c... */
    
    server_rec *read_config (pool *conf_pool, pool *temp_pool, char 
*config_name);
  + void init_modules(pool *p, server_rec *s);
    void setup_prelinked_modules();
    void show_directives();
    void show_modules();
  
  
  
  1.149.2.1 +19 -14    apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.149
  retrieving revision 1.149.2.1
  diff -C3 -r1.149 -r1.149.2.1
  *** http_main.c       1997/05/29 04:50:27     1.149
  --- http_main.c       1997/06/27 01:47:46     1.149.2.1
  ***************
  *** 1981,1986 ****
  --- 1981,1988 ----
            exit(1);
        }
    
  +     s = ap_slack(s, AP_SLACK_HIGH);
  + 
        note_cleanups_for_fd(pconf, s); /* arrange to close on exec or restart 
*/
        
    #ifndef MPE
  ***************
  *** 2135,2154 ****
        ptrans = make_sub_pool (pconf);
    
        server_conf = read_config (pconf, ptrans, server_confname); 
  -     open_logs (server_conf, pconf);
  -     set_group_privs ();
  -     accept_mutex_init (pconf);
  -     if (!is_graceful) {
  -         reinit_scoreboard(pconf);
  -     }
  - #ifdef SCOREBOARD_FILE
  -     else {
  -         scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
  -         note_cleanups_for_fd (pconf, scoreboard_fd);
  -     }
  - #endif
  - 
  -     default_server_hostnames (server_conf);
    
        if (listeners == NULL) {
            if (!is_graceful) {
  --- 2137,2142 ----
  ***************
  *** 2183,2188 ****
  --- 2171,2192 ----
            sd = -1;
        }
    
  +     init_modules (pconf, server_conf);
  +     open_logs (server_conf, pconf);
  +     set_group_privs ();
  +     accept_mutex_init (pconf);
  +     if (!is_graceful) {
  +         reinit_scoreboard(pconf);
  +     }
  + #ifdef SCOREBOARD_FILE
  +     else {
  +         scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
  +         note_cleanups_for_fd (pconf, scoreboard_fd);
  +     }
  + #endif
  + 
  +     default_server_hostnames (server_conf);
  + 
        set_signals ();
        log_pid (pconf, pid_fname);
    
  ***************
  *** 2391,2396 ****
  --- 2395,2401 ----
    
        suexec_enabled = init_suexec();
        server_conf = read_config (pconf, ptrans, server_confname);
  +     init_modules (pconf, server_conf);
        
        if(standalone) {
            clear_pool (pconf); /* standalone_main rereads... */
  
  
  
  1.111.2.1 +29 -0     apache/src/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/httpd.h,v
  retrieving revision 1.111
  retrieving revision 1.111.2.1
  diff -C3 -r1.111 -r1.111.2.1
  *** httpd.h   1997/06/05 22:53:27     1.111
  --- httpd.h   1997/06/27 01:47:47     1.111.2.1
  ***************
  *** 268,273 ****
  --- 268,274 ----
    #define DECLINED -1         /* Module declines to handle */
    #define OK 0                        /* Module has handled this stage. */
    
  + 
    /* ----------------------- HTTP Status Codes  ------------------------- */
    
    #define RESPONSE_CODES 38
  ***************
  *** 711,713 ****
  --- 712,742 ----
    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.52.2.2  +27 -0     apache/src/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/util.c,v
  retrieving revision 1.52.2.1
  retrieving revision 1.52.2.2
  diff -C3 -r1.52.2.1 -r1.52.2.2
  *** util.c    1997/06/24 00:11:10     1.52.2.1
  --- util.c    1997/06/27 01:47:47     1.52.2.2
  ***************
  *** 1326,1328 ****
  --- 1326,1355 ----
        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
  + }
  
  
  

Reply via email to