manoj 99/08/12 23:58:14
Modified: mpm/src/include http_connection.h httpd.h mpm/src/main http_connection.c mpm/src/modules/mpm/dexter dexter.c mpm/src/modules/mpm/mpmt_pthread mpmt_pthread.c mpm/src/modules/mpm/prefork prefork.c mpm/src/modules/mpm/spmt_os2 spmt_os2.c mpm/src/modules/mpm/winnt winnt.c Log: Add a connection ID to conn_rec. It uniquely identifies a connection at any instant in time. It's not very well tested yet. Revision Changes Path 1.7 +1 -1 apache-2.0/mpm/src/include/http_connection.h Index: http_connection.h =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/include/http_connection.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -u -r1.6 -r1.7 --- http_connection.h 1999/08/05 19:56:04 1.6 +++ http_connection.h 1999/08/13 06:57:30 1.7 @@ -66,7 +66,7 @@ conn_rec *ap_new_connection(pool *p, server_rec *server, BUFF *inout, const struct sockaddr_in *remaddr, - const struct sockaddr_in *saddr); + const struct sockaddr_in *saddr, long id); CORE_EXPORT(void) ap_process_connection(conn_rec *); int ap_process_http_connection(conn_rec *); 1.12 +2 -0 apache-2.0/mpm/src/include/httpd.h Index: httpd.h =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/include/httpd.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -u -r1.11 -r1.12 --- httpd.h 1999/08/06 00:54:19 1.11 +++ httpd.h 1999/08/13 06:57:33 1.12 @@ -816,6 +816,8 @@ char *local_host; /* used for ap_get_server_name when * UseCanonicalName is set to DNS * (ignores setting of HostnameLookups) */ + long id; /* ID of this connection; unique at any + * point in time */ void *conn_config; /* Notes on *this* connection */ }; 1.17 +3 -1 apache-2.0/mpm/src/main/http_connection.c Index: http_connection.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/main/http_connection.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -u -r1.16 -r1.17 --- http_connection.c 1999/08/06 00:54:29 1.16 +++ http_connection.c 1999/08/13 06:57:40 1.17 @@ -258,7 +258,7 @@ conn_rec *ap_new_connection(pool *p, server_rec *server, BUFF *inout, const struct sockaddr_in *remaddr, - const struct sockaddr_in *saddr) + const struct sockaddr_in *saddr, long id) { conn_rec *conn = (conn_rec *) ap_pcalloc(p, sizeof(conn_rec)); @@ -278,6 +278,8 @@ conn->remote_addr = *remaddr; conn->remote_ip = ap_pstrdup(conn->pool, inet_ntoa(conn->remote_addr.sin_addr)); + + conn->id = id; return conn; } 1.22 +43 -33 apache-2.0/mpm/src/modules/mpm/dexter/dexter.c Index: dexter.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/dexter/dexter.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -u -r1.21 -r1.22 --- dexter.c 1999/08/12 02:02:27 1.21 +++ dexter.c 1999/08/13 06:57:46 1.22 @@ -145,18 +145,17 @@ static pool *pconf; /* Pool for config stuff */ static pool *pchild; /* Pool for httpd child stuff */ - -typedef struct { - pool *pool; - pthread_mutex_t mutex; - pthread_attr_t attr; -} worker_thread_info; +static pool *thread_pool_parent; /* Parent of per-thread pools */ +static pthread_mutex_t thread_pool_create_mutex; +static int child_num; static int my_pid; /* Linux getpid() doesn't work except in main thread. Use this instead */ /* Keep track of the number of worker threads currently active */ static int worker_thread_count; static pthread_mutex_t worker_thread_count_mutex; +static int worker_thread_free_ids[HARD_THREAD_LIMIT]; +static pthread_attr_t worker_thread_attr; /* Keep track of the number of idle worker threads */ static int idle_thread_count; @@ -849,7 +848,8 @@ * Child process main loop. */ -static void process_socket(pool *p, struct sockaddr *sa_client, int csd) +static void process_socket(pool *p, struct sockaddr *sa_client, int csd, + int conn_id) { struct sockaddr sa_server; /* ZZZZ */ size_t len = sizeof(struct sockaddr); @@ -886,7 +886,8 @@ current_conn = ap_new_connection(p, server_conf, conn_io, (const struct sockaddr_in *) sa_client, - (const struct sockaddr_in *) &sa_server); + (const struct sockaddr_in *) &sa_server, + conn_id); ap_process_connection(current_conn); } @@ -895,7 +896,7 @@ static void *worker_thread_one_child(void *); /* Starts a thread as long as we're below max_threads */ -static int start_thread(worker_thread_info *thread_info) +static int start_thread(void) { pthread_t thread; void *(*thread_function)(void *); @@ -908,19 +909,21 @@ else { thread_function = worker_thread; } - worker_thread_count++; - if (pthread_create(&thread, &(thread_info->attr), thread_function, thread_info)) { + if (pthread_create(&thread, &worker_thread_attr, thread_function, + &worker_thread_free_ids[worker_thread_count])) { ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf, "pthread_create: unable to create worker thread"); /* In case system resources are maxxed out, we don't want Apache running away with the CPU trying to fork over and over and over again if we exit. */ sleep(10); - worker_thread_count--; workers_may_exit = 1; pthread_mutex_unlock(&worker_thread_count_mutex); return 0; } + else { + worker_thread_count++; + } } else { static int reported = 0; @@ -973,12 +976,13 @@ int poll_count = 0; static int curr_pollfd = 0; size_t len = sizeof(struct sockaddr); - worker_thread_info *thread_info = arg; int thread_just_started = 1; + int thread_num = *((int *) arg); + long conn_id = child_num * HARD_THREAD_LIMIT + thread_num; - pthread_mutex_lock(&thread_info->mutex); - tpool = ap_make_sub_pool(thread_info->pool); - pthread_mutex_unlock(&thread_info->mutex); + pthread_mutex_lock(&thread_pool_create_mutex); + tpool = ap_make_sub_pool(thread_pool_parent); + pthread_mutex_unlock(&thread_pool_create_mutex); ptrans = ap_make_sub_pool(tpool); while (!workers_may_exit) { @@ -1054,7 +1058,7 @@ idle_thread_count--; } else { - if (!start_thread(thread_info)) { + if (!start_thread()) { idle_thread_count--; } } @@ -1066,7 +1070,7 @@ pthread_mutex_unlock(&idle_thread_count_mutex); break; } - process_socket(ptrans, &sa_client, csd); + process_socket(ptrans, &sa_client, csd, conn_id); ap_clear_pool(ptrans); requests_this_child--; } @@ -1074,6 +1078,7 @@ ap_destroy_pool(tpool); pthread_mutex_lock(&worker_thread_count_mutex); worker_thread_count--; + worker_thread_free_ids[worker_thread_count] = thread_num; if (worker_thread_count == 0) { /* All the threads have exited, now finish the shutdown process * by signalling the sigwait thread */ @@ -1094,12 +1099,13 @@ int srv; int curr_pollfd, last_pollfd = 0; size_t len = sizeof(struct sockaddr); - worker_thread_info *thread_info = arg; int thread_just_started = 1; + int thread_num = *((int *) arg); + long conn_id = child_num * HARD_THREAD_LIMIT + thread_num; - pthread_mutex_lock(&thread_info->mutex); - tpool = ap_make_sub_pool(thread_info->pool); - pthread_mutex_unlock(&thread_info->mutex); + pthread_mutex_lock(&thread_pool_create_mutex); + tpool = ap_make_sub_pool(thread_pool_parent); + pthread_mutex_unlock(&thread_pool_create_mutex); ptrans = ap_make_sub_pool(tpool); while (!workers_may_exit) { @@ -1179,7 +1185,7 @@ idle_thread_count--; } else { - if (!start_thread(thread_info)) { + if (!start_thread()) { idle_thread_count--; } } @@ -1192,7 +1198,7 @@ pthread_mutex_unlock(&idle_thread_count_mutex); break; } - process_socket(ptrans, &sa_client, csd); + process_socket(ptrans, &sa_client, csd, conn_id); ap_clear_pool(ptrans); requests_this_child--; } @@ -1200,6 +1206,7 @@ ap_destroy_pool(tpool); pthread_mutex_lock(&worker_thread_count_mutex); worker_thread_count--; + worker_thread_free_ids[worker_thread_count] = thread_num; if (worker_thread_count == 0) { /* All the threads have exited, now finish the shutdown process * by signalling the sigwait thread */ @@ -1210,15 +1217,15 @@ return NULL; } -static void child_main(void) +static void child_main(int child_num_arg) { sigset_t sig_mask; int signal_received; int i; - worker_thread_info thread_info; ap_listen_rec *lr; my_pid = getpid(); + child_num = child_num_arg; pchild = ap_make_sub_pool(pconf); /*stuff to do before we switch id's, so we have permissions.*/ @@ -1261,18 +1268,21 @@ } idle_thread_count = threads_to_start; worker_thread_count = 0; - thread_info.pool = ap_make_sub_pool(pconf); - pthread_mutex_init(&thread_info.mutex, NULL); + for (i = 0; i < max_threads; i++) { + worker_thread_free_ids[i] = i; + } + thread_pool_parent = ap_make_sub_pool(pchild); + pthread_mutex_init(&thread_pool_create_mutex, NULL); pthread_mutex_init(&idle_thread_count_mutex, NULL); pthread_mutex_init(&worker_thread_count_mutex, NULL); pthread_mutex_init(&pipe_of_death_mutex, NULL); - pthread_attr_init(&thread_info.attr); - pthread_attr_setdetachstate(&thread_info.attr, PTHREAD_CREATE_DETACHED); + pthread_attr_init(&worker_thread_attr); + pthread_attr_setdetachstate(&worker_thread_attr, PTHREAD_CREATE_DETACHED); /* We are creating worker threads right now */ for (i=0; i < threads_to_start; i++) { /* start_thread shouldn't fail here */ - if (!start_thread(&thread_info)) { + if (!start_thread()) { break; } } @@ -1307,7 +1317,7 @@ if (one_process) { set_signals(); ap_scoreboard_image[slot].pid = getpid(); - child_main(); + child_main(slot); } if ((pid = fork()) == -1) { @@ -1338,7 +1348,7 @@ /* XXX - For an unthreaded server, a signal handler will be necessary signal(SIGTERM, just_die); */ - child_main(); + child_main(slot); return 0; } 1.26 +3 -1 apache-2.0/mpm/src/modules/mpm/mpmt_pthread/mpmt_pthread.c Index: mpmt_pthread.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/mpmt_pthread/mpmt_pthread.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -u -r1.25 -r1.26 --- mpmt_pthread.c 1999/08/11 23:55:42 1.25 +++ mpmt_pthread.c 1999/08/13 06:57:52 1.26 @@ -864,6 +864,7 @@ BUFF *conn_io; conn_rec *current_conn; ap_iol *iol; + long conn_id = my_child_num * HARD_THREAD_LIMIT + my_thread_num; if (getsockname(csd, &sa_server, &len) < 0) { ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname"); @@ -896,7 +897,8 @@ current_conn = ap_new_connection(p, server_conf, conn_io, (const struct sockaddr_in *) sa_client, - (const struct sockaddr_in *) &sa_server); + (const struct sockaddr_in *) &sa_server, + conn_id); ap_process_connection(current_conn); } 1.26 +2 -1 apache-2.0/mpm/src/modules/mpm/prefork/prefork.c Index: prefork.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/prefork/prefork.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -u -r1.25 -r1.26 --- prefork.c 1999/08/06 00:54:42 1.25 +++ prefork.c 1999/08/13 06:57:56 1.26 @@ -2359,7 +2359,8 @@ current_conn = ap_new_connection(ptrans, server_conf, conn_io, (struct sockaddr_in *) &sa_client, - (struct sockaddr_in *) &sa_server); + (struct sockaddr_in *) &sa_server, + my_child_num); ap_process_connection(current_conn); } 1.9 +2 -1 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.8 retrieving revision 1.9 diff -u -d -u -r1.8 -r1.9 --- spmt_os2.c 1999/08/05 19:56:24 1.8 +++ spmt_os2.c 1999/08/13 06:58:02 1.9 @@ -1135,7 +1135,8 @@ current_conn = ap_new_connection(ptrans, server_conf, conn_io, (struct sockaddr_in *) &sa_client, - (struct sockaddr_in *) &sa_server); + (struct sockaddr_in *) &sa_server, + THREAD_GLOBAL(child_num)); ap_process_connection(current_conn); } 1.4 +2 -2 apache-2.0/mpm/src/modules/mpm/winnt/winnt.c Index: winnt.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/winnt/winnt.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -u -r1.3 -r1.4 --- winnt.c 1999/08/11 16:03:55 1.3 +++ winnt.c 1999/08/13 06:58:08 1.4 @@ -726,8 +726,8 @@ current_conn = ap_new_connection(ptrans, server_conf, conn_io, (struct sockaddr_in *) &sa_client, - (struct sockaddr_in *) &sa_server);//, - //child_num, 0); /* Set my_thread_num to 0 for now */ + (struct sockaddr_in *) &sa_server, + child_num); ap_process_connection(current_conn); }