bjh 99/07/12 01:35:39
Modified: mpm/src/modules/mpm/spmt_os2 spmt_os2.c Log: Assorted fixes for the OS/2 mpm: - pchild really should be thread local - clean_child_exit() should call _endthread(), not exit() - Use DosSleep() for delay in wait_or_timeout() instead of ap_select - Rework logic of searching for listen rec in child main, was getting hung in infinite loop when two sockets were being listened to. NOTE: I got it from prefork.c originally so that's probably broken too. - Remove a debugging fprintf I accidentally left in... Revision Changes Path 1.2 +25 -24 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.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- spmt_os2.c 1999/07/11 14:49:06 1.1 +++ spmt_os2.c 1999/07/12 08:35:39 1.2 @@ -151,12 +151,12 @@ #endif static pool *pconf; /* Pool for config stuff */ -static pool *pchild; /* Pool for httpd child 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 { + pool *pchild; /* Pool for httpd child stuff */ int srv; int csd; int requests_this_child; @@ -188,13 +188,12 @@ /* a clean exit from a child with proper cleanup */ -static void clean_child_exit(int code) __attribute__ ((noreturn)); static void clean_child_exit(int code) { - if (pchild) { - ap_destroy_pool(pchild); + if (THREAD_GLOBAL(pchild)) { + ap_destroy_pool(THREAD_GLOBAL(pchild)); } - exit(code); + _endthread(); } @@ -232,7 +231,7 @@ static void accept_mutex_init(pool *p) { int rc = DosCreateMutexSem(NULL, &lock_sem, DC_SEM_SHARED, FALSE); -fprintf(stderr, "Created mutex\n"); + if (rc != 0) { ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, server_conf, "Parent cannot create lock semaphore, rc=%d", rc); @@ -532,7 +531,6 @@ static int wait_or_timeout(ap_wait_t *status) { - struct timeval tv; int ret; ++wait_or_timeout_counter; @@ -549,9 +547,8 @@ if (ret > 0) { return ret; } - tv.tv_sec = SCOREBOARD_MAINTENANCE_INTERVAL / 1000000; - tv.tv_usec = SCOREBOARD_MAINTENANCE_INTERVAL % 1000000; - ap_select(0, NULL, NULL, NULL, &tv); + + DosSleep(SCOREBOARD_MAINTENANCE_INTERVAL / 1000); return -1; } @@ -905,15 +902,15 @@ NET_SIZE_T clen; struct sockaddr sa_server; struct sockaddr sa_client; - ap_listen_rec *lr; - ap_listen_rec *last_lr; + ap_listen_rec *lr = NULL; + 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(); - last_lr = NULL; /* Disable the restart signal handlers and enable the just_die stuff. * Note that since restart() just notes that a restart has been @@ -928,6 +925,7 @@ */ pchild = ap_make_sub_pool(pconf); *ppthread_globals = (struct thread_globals *)ap_palloc(pchild, sizeof(struct thread_globals)); + THREAD_GLOBAL(pchild) = pchild; THREAD_GLOBAL(ap_my_generation) = 0; THREAD_GLOBAL(requests_this_child) = 0; THREAD_GLOBAL(csd) = -1; @@ -997,23 +995,27 @@ /* we remember the last_lr we searched last time around so that we don't end up starving any particular listening socket */ - if (last_lr == NULL) { - lr = ap_listeners; + if (first_lr == NULL) { + first_lr = ap_listeners; } - else { - lr = last_lr->next; - } - while (lr != last_lr) { + + lr = first_lr; + + do { if (!lr) { lr = ap_listeners; + } + + if (FD_ISSET(lr->fd, &THREAD_GLOBAL(main_fds))) { + first_lr = lr->next; + break; } - if (FD_ISSET(lr->fd, &THREAD_GLOBAL(main_fds))) break; lr = lr->next; - } - if (lr == last_lr) { + } while (lr != first_lr); + + if (lr == first_lr) { continue; } - last_lr = lr; sd = lr->fd; } else { @@ -1181,7 +1183,6 @@ } ap_update_child_status(slot, SERVER_STARTING, (request_rec *) NULL); -fprintf(stderr, "Starting thread %d\n", slot); if ((tid = _beginthread(child_main, NULL, 65536, (void *)slot)) == -1) { ap_log_error(APLOG_MARK, APLOG_ERR, s, "_beginthread: Unable to create new thread");