bjh         99/07/13 02:32:45

  Modified:    mpm/src/modules/mpm/spmt_os2 scoreboard.h spmt_os2.c
  Log:
  More cleanup on OS/2 spmt mpm including shutdown/restart processing and
  moving variables to appropriate scope.
  
  Revision  Changes    Path
  1.2       +3 -1      apache-2.0/mpm/src/modules/mpm/spmt_os2/scoreboard.h
  
  Index: scoreboard.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/spmt_os2/scoreboard.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- scoreboard.h      1999/07/11 14:49:06     1.1
  +++ scoreboard.h      1999/07/13 09:31:59     1.2
  @@ -153,6 +153,7 @@
       char request[64];                /* We just want an idea... */
       server_rec *vhostrec;    /* What virtual host is being accessed? */
                                   /* SEE ABOVE FOR SAFE USAGE! */
  +    int thread_retval;
   } short_score;
   
   typedef struct {
  @@ -162,12 +163,13 @@
   
   /* stuff which the parent generally writes and the children rarely read */
   typedef struct {
  -    pid_t pid;
  +    pid_t tid;
   #ifdef OPTIMIZE_TIMEOUTS
       time_t last_rtime;               /* time(0) of the last change */
       vtime_t last_vtime;              /* the last vtime the parent has seen */
   #endif
       ap_generation_t generation;      /* generation of this child */
  +    int deferred_die;
   } parent_score;
   
   typedef struct {
  
  
  
  1.3       +94 -125   apache-2.0/mpm/src/modules/mpm/spmt_os2/spmt_os2.c
  
  Index: spmt_os2.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/spmt_os2/spmt_os2.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- spmt_os2.c        1999/07/12 08:35:39     1.2
  +++ spmt_os2.c        1999/07/13 09:31:59     1.3
  @@ -55,28 +55,6 @@
    *
    */
   
  -/*
  - * httpd.c: simple http daemon for answering WWW file requests
  - *
  - * 
  - * 03-21-93  Rob McCool wrote original code (up to NCSA HTTPd 1.3)
  - * 
  - * 03-06-95  blong
  - *  changed server number for child-alone processes to 0 and changed name
  - *   of processes
  - *
  - * 03-10-95  blong
  - *      Added numerous speed hacks proposed by Robert S. Thau ([EMAIL 
PROTECTED]) 
  - *      including set group before fork, and call gettime before to fork
  - *      to set up libraries.
  - *
  - * 04-14-95  rst / rh
  - *      Brandon's code snarfed from NCSA 1.4, but tinkered to work with the
  - *      Apache server, and also to have child processes do accept() directly.
  - *
  - * April-July '95 rst
  - *      Extensive rework for Apache.
  - */
   
   
   #define CORE_PRIVATE
  @@ -100,7 +78,6 @@
   
   static int ap_max_requests_per_child=0;
   static char *ap_pid_fname=NULL;
  -static char *ap_server_argv0=NULL;
   static int ap_daemons_to_start=0;
   static int ap_daemons_min_free=0;
   static int ap_daemons_max_free=0;
  @@ -120,7 +97,6 @@
   /* *Non*-shared http_main globals... */
   
   static server_rec *server_conf;
  -static int sd;
   static fd_set listenfds;
   static int listenmaxfd;
   
  @@ -151,17 +127,12 @@
   #endif
   
   static pool *pconf;          /* Pool for config stuff */
  -static int my_pid;   /* it seems silly to call getpid all the time */
   static scoreboard *ap_scoreboard_image = NULL;
  -static int volatile exit_after_unblock = 0;
   
   struct thread_globals {
  +    int child_num;
       pool *pchild;            /* Pool for httpd child stuff */
  -    int srv;
  -    int csd;
  -    int requests_this_child;
  -    fd_set main_fds;
  -    ap_generation_t ap_my_generation;
  +    int usr1_just_die;
   };
   
   static struct thread_globals **ppthread_globals = NULL;
  @@ -171,11 +142,14 @@
   
   void reinit_scoreboard(pool *p)
   {
  -    ap_assert(!ap_scoreboard_image);
  -    ap_scoreboard_image = (scoreboard *) malloc(SCOREBOARD_SIZE);
       if (ap_scoreboard_image == NULL) {
  -        fprintf(stderr, "Ouch! Out of memory reiniting scoreboard!\n");
  +        ap_scoreboard_image = (scoreboard *) malloc(SCOREBOARD_SIZE);
  +
  +        if (ap_scoreboard_image == NULL) {
  +            fprintf(stderr, "Ouch! Out of memory reiniting scoreboard!\n");
  +        }
       }
  +
       memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
   }
   
  @@ -191,8 +165,10 @@
   static void clean_child_exit(int code)
   {
       if (THREAD_GLOBAL(pchild)) {
  -     ap_destroy_pool(THREAD_GLOBAL(pchild));
  +        ap_destroy_pool(THREAD_GLOBAL(pchild));
       }
  +
  +    ap_scoreboard_image->servers[THREAD_GLOBAL(child_num)].thread_retval = 
code;
       _endthread();
   }
   
  @@ -435,12 +411,13 @@
            ss->vhostrec =  r->server;
        }
       }
  +
       if (status == SERVER_STARTING && r == NULL) {
        /* clean up the slot's vhostrec pointer (maybe re-used)
         * and mark the slot as belonging to a new generation.
         */
        ss->vhostrec = NULL;
  -     ap_scoreboard_image->parent[child_num].generation = 
THREAD_GLOBAL(ap_my_generation);
  +     ap_scoreboard_image->parent[child_num].generation = 
ap_scoreboard_image->global.running_generation;
       }
   
       return old_status;
  @@ -487,6 +464,7 @@
       }
   }
   
  +/* TODO: call me some time */
   static void increment_counts(int child_num, request_rec *r)
   {
       long int bs = 0;
  @@ -508,18 +486,18 @@
       ss->conn_bytes += (unsigned long) bs;
   }
   
  -static int find_child_by_pid(int pid)
  +static int find_child_by_tid(int tid)
   {
       int i;
   
       for (i = 0; i < max_daemons_limit; ++i)
  -     if (ap_scoreboard_image->parent[i].pid == pid)
  +     if (ap_scoreboard_image->parent[i].tid == tid)
            return i;
   
       return -1;
   }
   
  -/* Finally, this routine is used by the caretaker process to wait for
  +/* Finally, this routine is used by the caretaker thread to wait for
    * a while...
    */
   
  @@ -532,6 +510,7 @@
   static int wait_or_timeout(ap_wait_t *status)
   {
       int ret;
  +    ULONG tid;
   
       ++wait_or_timeout_counter;
       if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) {
  @@ -540,12 +519,15 @@
        probe_writable_fds();
   #endif
       }
  -    ret = waitpid(-1, status, WNOHANG);
  -    if (ret == -1 && errno == EINTR) {
  -     return -1;
  -    }
  -    if (ret > 0) {
  -     return ret;
  +
  +    tid = 0;
  +    ret = DosWaitThread(&tid, DCWW_NOWAIT);
  +
  +    if (ret == 0) {
  +        int child_num = find_child_by_tid(tid);
  +        ap_assert( child_num > 0 );
  +        *status = ap_scoreboard_image->servers[child_num].thread_retval;
  +     return tid;
       }
       
       DosSleep(SCOREBOARD_MAINTENANCE_INTERVAL / 1000);
  @@ -709,15 +691,13 @@
       clean_child_exit(0);
   }
   
  -static int volatile deferred_die;
  -static int volatile usr1_just_die;
   
   static void usr1_handler(int sig)
   {
  -    if (usr1_just_die) {
  +    if (THREAD_GLOBAL(usr1_just_die)) {
        just_die(sig);
       }
  -    deferred_die = 1;
  +    ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die = 1;
   }
   
   /* volatile just in case */
  @@ -878,20 +858,18 @@
   
   /*****************************************************************
    * Child process main loop.
  - * The following vars are static to avoid getting clobbered by longjmp();
  - * they are really private to child_main.
    */
   
   API_EXPORT(void) ap_child_terminate(request_rec *r)
   {
       r->connection->keepalive = 0;
  -    THREAD_GLOBAL(requests_this_child) = ap_max_requests_per_child = 1;
  +    ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die = 1;
   }
   
   int ap_graceful_stop_signalled(void)
   {
  -    if (deferred_die ||
  -     ap_scoreboard_image->global.running_generation != 
THREAD_GLOBAL(ap_my_generation)) {
  +    if (ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die ||
  +     ap_scoreboard_image->global.running_generation != 
ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].generation) {
        return 1;
       }
       return 0;
  @@ -906,16 +884,18 @@
       ap_listen_rec *first_lr = NULL;
       pool *ptrans;
       conn_rec *current_conn;
  -    int my_child_num = (int)child_num_arg;
       ap_iol *iol;
       pool *pchild;
  -
  -    my_pid = getpid();
  +    parent_score *sc_parent_rec;
  +    int csd = -1, requests_this_child = 0;
  +    fd_set main_fds;
   
       /* Disable the restart signal handlers and enable the just_die stuff.
        * Note that since restart() just notes that a restart has been
        * requested there's no race condition here.
        */
  +
  +    set_signals(); /* signals aren't inherrited by child threads */
       signal(SIGHUP, just_die);
       signal(SIGUSR1, just_die);
       signal(SIGTERM, just_die);
  @@ -925,10 +905,9 @@
        */
       pchild = ap_make_sub_pool(pconf);
       *ppthread_globals = (struct thread_globals *)ap_palloc(pchild, 
sizeof(struct thread_globals));
  +    THREAD_GLOBAL(child_num) = (int)child_num_arg;
  +    sc_parent_rec = ap_scoreboard_image->parent + THREAD_GLOBAL(child_num);
       THREAD_GLOBAL(pchild) = pchild;
  -    THREAD_GLOBAL(ap_my_generation) = 0;
  -    THREAD_GLOBAL(requests_this_child) = 0;
  -    THREAD_GLOBAL(csd) = -1;
       ptrans = ap_make_sub_pool(pchild);
   
       /* needs to be done before we switch UIDs so we have permissions */
  @@ -936,19 +915,19 @@
   
       ap_child_init_hook(pchild, server_conf);
   
  -    (void) ap_update_child_status(my_child_num, SERVER_READY, (request_rec 
*) NULL);
  +    (void) ap_update_child_status(THREAD_GLOBAL(child_num), SERVER_READY, 
(request_rec *) NULL);
   
       signal(SIGHUP, just_die);
       signal(SIGTERM, just_die);
  -    set_signals();
   
       while (!ap_graceful_stop_signalled()) {
  -     BUFF *conn_io;
  +        BUFF *conn_io;
  +        int srv, sd;
   
        /* Prepare to receive a SIGUSR1 due to graceful restart so that
         * we can exit cleanly.
         */
  -     usr1_just_die = 1;
  +     THREAD_GLOBAL(usr1_just_die) = 1;
        signal(SIGUSR1, usr1_handler);
   
        /*
  @@ -960,11 +939,11 @@
        ap_clear_pool(ptrans);
   
        if ((ap_max_requests_per_child > 0
  -          && THREAD_GLOBAL(requests_this_child)++ >= 
ap_max_requests_per_child)) {
  +          && requests_this_child++ >= ap_max_requests_per_child)) {
            clean_child_exit(0);
        }
   
  -     (void) ap_update_child_status(my_child_num, SERVER_READY, (request_rec 
*) NULL);
  +     (void) ap_update_child_status(THREAD_GLOBAL(child_num), SERVER_READY, 
(request_rec *) NULL);
   
        /*
         * Wait for an acceptable connection to arrive.
  @@ -976,10 +955,10 @@
        for (;;) {
            if (ap_listeners->next) {
                /* more than one socket */
  -             memcpy(&THREAD_GLOBAL(main_fds), &listenfds, sizeof(fd_set));
  -             THREAD_GLOBAL(srv) = ap_select(listenmaxfd + 1, 
&THREAD_GLOBAL(main_fds), NULL, NULL, NULL);
  +             memcpy(&main_fds, &listenfds, sizeof(fd_set));
  +             srv = ap_select(listenmaxfd + 1, &main_fds, NULL, NULL, NULL);
   
  -             if (THREAD_GLOBAL(srv) < 0 && errno != EINTR) {
  +             if (srv < 0 && errno != EINTR) {
                    /* Single Unix documents select as returning errnos
                     * EBADF, EINTR, and EINVAL... and in none of those
                     * cases does it make sense to continue.  In fact
  @@ -990,7 +969,7 @@
                    clean_child_exit(1);
                }
   
  -             if (THREAD_GLOBAL(srv) <= 0)
  +             if (srv <= 0)
                    continue;
   
                /* we remember the last_lr we searched last time around so that
  @@ -1006,7 +985,7 @@
                        lr = ap_listeners;
                    }
                    
  -                 if (FD_ISSET(lr->fd, &THREAD_GLOBAL(main_fds))) {
  +                 if (FD_ISSET(lr->fd, &main_fds)) {
                           first_lr = lr->next;
                        break;
                    }
  @@ -1026,19 +1005,19 @@
            /* if we accept() something we don't want to die, so we have to
             * defer the exit
             */
  -         usr1_just_die = 0;
  +         THREAD_GLOBAL(usr1_just_die) = 0;
            for (;;) {
  -             if (deferred_die) {
  +             if 
(ap_scoreboard_image->parent[THREAD_GLOBAL(child_num)].deferred_die) {
                    /* we didn't get a socket, and we were told to die */
                    clean_child_exit(0);
                }
                clen = sizeof(sa_client);
  -             THREAD_GLOBAL(csd) = ap_accept(sd, &sa_client, &clen);
  -             if (THREAD_GLOBAL(csd) >= 0 || errno != EINTR)
  +             csd = ap_accept(sd, &sa_client, &clen);
  +             if (csd >= 0 || errno != EINTR)
                    break;
            }
   
  -         if (THREAD_GLOBAL(csd) >= 0)
  +         if (csd >= 0)
                break;          /* We have a socket ready for reading */
            else {
   
  @@ -1103,7 +1082,7 @@
            if (ap_graceful_stop_signalled()) {
                clean_child_exit(0);
            }
  -         usr1_just_die = 1;
  +         THREAD_GLOBAL(usr1_just_die) = 1;
        }
   
        SAFE_ACCEPT(accept_mutex_off());        /* unlock after "accept" */
  @@ -1121,32 +1100,32 @@
         */
   
        clen = sizeof(sa_server);
  -     if (getsockname(THREAD_GLOBAL(csd), &sa_server, &clen) < 0) {
  +     if (getsockname(csd, &sa_server, &clen) < 0) {
            ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname");
  -         close(THREAD_GLOBAL(csd));
  +         close(csd);
            continue;
        }
   
  -     sock_disable_nagle(THREAD_GLOBAL(csd));
  +     sock_disable_nagle(csd);
   
  -        iol = os2_attach_socket(THREAD_GLOBAL(csd));
  +        iol = os2_attach_socket(csd);
   
        if (iol == NULL) {
            if (errno == EBADF) {
                ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
                    "filedescriptor (%u) larger than FD_SETSIZE (%u) "
                    "found, you probably need to rebuild Apache with a "
  -                 "larger FD_SETSIZE", THREAD_GLOBAL(csd), FD_SETSIZE);
  +                 "larger FD_SETSIZE", csd, FD_SETSIZE);
            }
            else {
                ap_log_error(APLOG_MARK, APLOG_WARNING, NULL,
                    "error attaching to socket");
            }
  -         close(THREAD_GLOBAL(csd));
  +         close(csd);
            continue;
           }
   
  -     (void) ap_update_child_status(my_child_num, SERVER_BUSY_READ,
  +     (void) ap_update_child_status(THREAD_GLOBAL(child_num), 
SERVER_BUSY_READ,
                                   (request_rec *) NULL);
   
        conn_io = ap_bcreate(ptrans, B_RDWR);
  @@ -1155,10 +1134,12 @@
        current_conn = ap_new_connection(ptrans, server_conf, conn_io,
                                         (struct sockaddr_in *) &sa_client,
                                         (struct sockaddr_in *) &sa_server,
  -                                      my_child_num, 0);
  +                                      THREAD_GLOBAL(child_num), 0);
   
        ap_process_connection(current_conn);
       }
  +
  +    clean_child_exit(0);
   }
   
   
  @@ -1200,7 +1181,7 @@
        return -1;
       }
   
  -    ap_scoreboard_image->parent[slot].pid = tid;
  +    ap_scoreboard_image->parent[slot].tid = tid;
       return 0;
   }
   
  @@ -1297,7 +1278,7 @@
         * shut down gracefully, in case it happened to pick up a request
         * while we were counting
         */
  -     kill(ap_scoreboard_image->parent[to_kill].pid, SIGUSR1);
  +     ap_scoreboard_image->parent[to_kill].deferred_die = 1;
        idle_spawn_rate = 1;
       }
       else if (idle_count < ap_daemons_min_free) {
  @@ -1343,7 +1324,7 @@
   }
   
   
  -static void process_child_status(int pid, ap_wait_t status)
  +static void process_child_status(int tid, ap_wait_t status)
   {
       /* Child died... if it died due to a fatal error,
        * we should simply bail out.
  @@ -1353,7 +1334,7 @@
        ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, server_conf,
                        "Child %d returned a Fatal error... \n"
                        "Apache is exiting!",
  -                     pid);
  +                     tid);
        exit(APEXIT_CHILDFATAL);
       }
       if (WIFSIGNALED(status)) {
  @@ -1369,9 +1350,9 @@
            if (WCOREDUMP(status)) {
                ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE,
                             server_conf,
  -                          "child pid %d exit signal %s (%d), "
  +                          "child tid %d exit signal %s (%d), "
                             "possible coredump in %s",
  -                          pid, (WTERMSIG(status) >= NumSIG) ? "" : 
  +                          tid, (WTERMSIG(status) >= NumSIG) ? "" :
                             SYS_SIGLIST[WTERMSIG(status)], WTERMSIG(status),
                             ap_coredump_dir);
            }
  @@ -1379,7 +1360,7 @@
   #endif
                ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE,
                             server_conf,
  -                          "child pid %d exit signal %s (%d)", pid,
  +                          "child tid %d exit signal %s (%d)", tid,
                             SYS_SIGLIST[WTERMSIG(status)], WTERMSIG(status));
   #ifdef WCOREDUMP
            }
  @@ -1387,8 +1368,8 @@
   #else
            ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE,
                         server_conf,
  -                      "child pid %d exit signal %d",
  -                      pid, WTERMSIG(status));
  +                      "child tid %d exit signal %d",
  +                      tid, WTERMSIG(status));
   #endif
        }
       }
  @@ -1424,11 +1405,10 @@
   int ap_mpm_run(pool *_pconf, pool *plog, server_rec *s)
   {
       int remaining_children_to_start;
  +    int i;
   
       pconf = _pconf;
  -
       server_conf = s;
  -
       ap_log_pid(pconf, ap_pid_fname);
   
       if (setup_listeners(pconf, s)) {
  @@ -1489,16 +1469,16 @@
       while (!restart_pending && !shutdown_pending) {
        int child_slot;
        ap_wait_t status;
  -     int pid = wait_or_timeout(&status);
  +     int tid = wait_or_timeout(&status);
   
        /* XXX: if it takes longer than 1 second for all our children
         * to start up and get into IDLE state then we may spawn an
         * extra child
         */
  -     if (pid >= 0) {
  -         process_child_status(pid, status);
  +     if (tid >= 0) {
  +         process_child_status(tid, status);
            /* non-fatal death... note that it's gone in the scoreboard. */
  -         child_slot = find_child_by_pid(pid);
  +         child_slot = find_child_by_tid(tid);
            if (child_slot >= 0) {
                (void) ap_update_child_status(child_slot, SERVER_DEAD,
                                            (request_rec *) NULL);
  @@ -1511,9 +1491,10 @@
                    --remaining_children_to_start;
                }
   #ifdef HAS_OTHER_CHILD
  +/* TODO: this won't work, we waited on a thread not a process
            }
            else if (reap_other_child(pid, status) == 0) {
  -             /* handled */
  +*/
   #endif
            }
            else if (is_graceful) {
  @@ -1522,7 +1503,7 @@
                    * child.
                    */
                ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, 
server_conf,
  -                         "long lost child came home! (pid %d)", pid);
  +                         "long lost child came home! (tid %d)", tid);
            }
            /* Don't perform idle maintenance when a child dies,
                * only do it when there's a timeout.  Remember only a
  @@ -1550,11 +1531,8 @@
   
       if (shutdown_pending) {
        /* Time to gracefully shut down:
  -      * Kill child processes, tell them to call child_exit, etc...
  +      * Don't worry about killing child threads for now, the all die when 
the parent exits
         */
  -     if (ap_killpg(getpgrp(), SIGTERM) < 0) {
  -         ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg 
SIGTERM");
  -     }
   
        /* cleanup pid file on normal shutdown */
        {
  @@ -1585,21 +1563,17 @@
       /* XXX: we really need to make sure this new generation number isn't in
        * use by any of the children.
        */
  -    ++THREAD_GLOBAL(ap_my_generation);
  -    ap_scoreboard_image->global.running_generation = 
THREAD_GLOBAL(ap_my_generation);
  +    ++ap_scoreboard_image->global.running_generation;
   
       if (is_graceful) {
  -#ifndef SCOREBOARD_FILE
  -     int i;
  -#endif
        ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
                    "SIGUSR1 received.  Doing graceful restart");
   
  -     /* kill off the idle ones */
  -     if (ap_killpg(getpgrp(), SIGUSR1) < 0) {
  -         ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg 
SIGUSR1");
  -     }
  -#ifndef SCOREBOARD_FILE
  +        /* kill off the idle ones */
  +        for (i = 0; i < ap_daemons_limit; ++i) {
  +            ap_scoreboard_image->parent[i].deferred_die = 1;
  +        }
  +
        /* This is mostly for debugging... so that we know what is still
            * gracefully dealing with existing request.  But we can't really
            * do it if we're in a SCOREBOARD_FILE because it'll cause
  @@ -1610,15 +1584,14 @@
                ap_scoreboard_image->servers[i].status = SERVER_GRACEFUL;
            }
        }
  -#endif
       }
       else {
        /* Kill 'em off */
  -     if (ap_killpg(getpgrp(), SIGHUP) < 0) {
  -         ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg 
SIGHUP");
  -     }
  +        for (i = 0; i < ap_daemons_limit; ++i) {
  +            DosKillThread(ap_scoreboard_image->parent[i].tid);
  +        }
        ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
  -                 "SIGHUP received.  Attempting to restart");
  +                     "SIGHUP received.  Attempting to restart");
       }
   
       if (!is_graceful) {
  @@ -1636,12 +1609,9 @@
   
   static void spmt_os2_pre_config(pool *pconf, pool *plog, pool *ptemp)
   {
  -    static int restart_num = 0;
  -
       one_process = ap_exists_config_define("ONE_PROCESS");
   
       is_graceful = 0;
  -    my_pid = getpid();
       ap_listen_pre_config();
       ap_daemons_to_start = DEFAULT_START_DAEMON;
       ap_daemons_min_free = DEFAULT_MIN_FREE_DAEMON;
  @@ -1831,7 +1801,6 @@
       NULL,                    /* merge per-server config structures */
       spmt_os2_cmds,           /* command table */
       NULL,                    /* handlers */
  -    NULL,                    /* check_user_id */
       NULL,                    /* check auth */
       NULL,                    /* check access */
       NULL,                    /* type_checker */
  
  
  

Reply via email to