This patch converts the AP_CHILD_THREAD_FROM_ID macro into two macros:
AP_CHILD_PSLOT_FROM_ID and AP_CHILD_TSLOT_FROM_ID. This was done so
that the values returned could be cached and reused, instead of calling
the macro over and over (which in many cases hides a multiplcation and
division of a long int).

I've changed the macro on all MPMs, and in all places in the core code where
the original macro was being used. Please review and commit.

-aaron

p.s. this is a half-step toward the plan to replace conn_rec->id with
two ints for the slots. Since conn_rec->id is used so often throughout
the code, I decided to hold off on that more radical change until after
this is in place.



Index: server/connection.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/connection.c,v
retrieving revision 1.84
diff -u -r1.84 connection.c
--- server/connection.c 2001/07/31 00:34:27     1.84
+++ server/connection.c 2001/10/01 22:03:21
@@ -157,7 +157,9 @@
     apr_int32_t timeout;
     apr_int32_t total_linger_time = 0;
 
-    ap_update_child_status(AP_CHILD_THREAD_FROM_ID(c->id), SERVER_CLOSING, NULL);
+    ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(c->id),
+                           AP_CHILD_TSLOT_FROM_ID(c->id),
+                           SERVER_CLOSING, NULL);
 
 #ifdef NO_LINGCLOSE
     ap_flush_conn(c);  /* just close it */
@@ -230,7 +232,8 @@
     conn_rec *conn = (conn_rec *) apr_pcalloc(p, sizeof(conn_rec));
     apr_status_t rv;
 
-    (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(id), 
+    (void) ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(id),
+                                  AP_CHILD_TSLOT_FROM_ID(id), 
                                   SERVER_BUSY_READ, (request_rec *) NULL);
 
     /* Got a connection structure, so initialize what fields we can
Index: server/protocol.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/protocol.c,v
retrieving revision 1.47
diff -u -r1.47 protocol.c
--- server/protocol.c   2001/09/29 08:48:59     1.47
+++ server/protocol.c   2001/10/01 22:03:22
@@ -413,7 +413,9 @@
 /* XXX If we want to keep track of the Method, the protocol module should do
  * it.  That support isn't in the scoreboard yet.  Hopefully next week 
  * sometime.   rbb */
-    ap_update_connection_status(AP_CHILD_THREAD_FROM_ID(conn->id), "Method", 
r->method); 
+    ap_update_connection_status(AP_CHILD_PSLOT_FROM_ID(conn->id),
+                                AP_CHILD_TSLOT_FROM_ID(conn->id),
+                                "Method", r->method); 
 #endif
     uri = ap_getword_white(r->pool, &ll);
 
Index: server/mpm/beos/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/beos/mpm_default.h,v
retrieving revision 1.4
diff -u -r1.4 mpm_default.h
--- server/mpm/beos/mpm_default.h       2001/02/16 04:26:50     1.4
+++ server/mpm/beos/mpm_default.h       2001/10/01 22:03:22
@@ -62,7 +62,8 @@
 /* we use the child (c) as zero in our code... */
 #define AP_ID_FROM_CHILD_THREAD(c, t)     t
 /* as the child is always zero, just return the id... */
-#define AP_CHILD_THREAD_FROM_ID(i)        0 , i
+#define AP_CHILD_PSLOT_FROM_ID(i)         0
+#define AP_CHILD_TSLOT_FROM_ID(i)         i
 
 /* Number of threads to spawn off by default --- also, if fewer than
  * this free when the caretaker checks, it will spawn more.
Index: server/mpm/mpmt_os2/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/mpmt_os2/mpm_default.h,v
retrieving revision 1.1
diff -u -r1.1 mpm_default.h
--- server/mpm/mpmt_os2/mpm_default.h   2001/08/17 17:07:34     1.1
+++ server/mpm/mpmt_os2/mpm_default.h   2001/10/01 22:03:23
@@ -109,8 +109,11 @@
 #define DEFAULT_MAX_REQUESTS_PER_CHILD 10000
 #endif
 
-/* AP_CHILD_THREAD_FROM_ID is used by the scoreboard.  */
-#define AP_CHILD_THREAD_FROM_ID(i)    (i / HARD_THREAD_LIMIT), (i % HARD_THREAD_LIMIT)
+/* AP_CHILD_PSLOT_FROM_ID and AP_CHILD_TSLOT_FROM_ID are
+ * used by the scoreboard.
+ */
+#define AP_CHILD_PSLOT_FROM_ID(i)        (i / HARD_THREAD_LIMIT)
+#define AP_CHILD_TSLOT_FROM_ID(i)        (i % HARD_THREAD_LIMIT)
 #define AP_ID_FROM_CHILD_THREAD(c, t)    ((c * HARD_THREAD_LIMIT) + t)
 
 #endif /* AP_MPM_DEFAULT_H */
Index: server/mpm/perchild/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/perchild/mpm_default.h,v
retrieving revision 1.7
diff -u -r1.7 mpm_default.h
--- server/mpm/perchild/mpm_default.h   2001/02/16 04:26:50     1.7
+++ server/mpm/perchild/mpm_default.h   2001/10/01 22:03:23
@@ -60,7 +60,8 @@
 #define APACHE_MPM_DEFAULT_H
 
 #define AP_ID_FROM_CHILD_THREAD(c, t)    ((c * HARD_THREAD_LIMIT) + t)
-#define AP_CHILD_THREAD_FROM_ID(i)    (i / HARD_THREAD_LIMIT), (i % HARD_THREAD_LIMIT)
+#define AP_CHILD_PSLOT_FROM_ID(i)        (i / HARD_THREAD_LIMIT)
+#define AP_CHILD_TSLOT_FROM_ID(i)        (i % HARD_THREAD_LIMIT)
 
 /* Number of threads to spawn off by default --- also, if fewer than
  * this free when the caretaker checks, it will spawn more.
Index: server/mpm/prefork/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/prefork/mpm_default.h,v
retrieving revision 1.6
diff -u -r1.6 mpm_default.h
--- server/mpm/prefork/mpm_default.h    2001/02/16 04:26:51     1.6
+++ server/mpm/prefork/mpm_default.h    2001/10/01 22:03:23
@@ -60,7 +60,8 @@
 #define APACHE_MPM_DEFAULT_H
 
 #define AP_ID_FROM_CHILD_THREAD(c, t)    c
-#define AP_CHILD_THREAD_FROM_ID(i)       i, 0
+#define AP_CHILD_PSLOT_FROM_ID(i)        i
+#define AP_CHILD_TSLOT_FROM_ID(i)        0
 
 
 /* Number of servers to spawn off by default --- also, if fewer than
Index: server/mpm/prefork/prefork.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/prefork/prefork.c,v
retrieving revision 1.201
diff -u -r1.201 prefork.c
--- server/mpm/prefork/prefork.c        2001/09/18 22:13:58     1.201
+++ server/mpm/prefork/prefork.c        2001/10/01 22:03:24
@@ -377,7 +377,9 @@
         ap_sync_scoreboard_image();
        if (ap_scoreboard_image->servers[n][0].status != SERVER_DEAD &&
                kill((pid = ap_scoreboard_image->parent[n].pid), 0) == -1) {
-           ap_update_child_status(AP_CHILD_THREAD_FROM_ID(n), SERVER_DEAD, NULL);
+            ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(n),
+                                   AP_CHILD_TSLOT_FROM_ID(n),
+                                   SERVER_DEAD, NULL);
            /* just mark it as having a successful exit status */
            memset(status, 0, sizeof(apr_wait_t));
            return(pid);
@@ -605,7 +607,9 @@
 
     ap_run_child_init(pchild, ap_server_conf);
 
-    (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(my_child_num), 
SERVER_READY, (request_rec *) NULL);
+    (void) ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(my_child_num),
+                                  AP_CHILD_TSLOT_FROM_ID(my_child_num),
+                                  SERVER_READY, (request_rec *)NULL);
 
     ap_sync_scoreboard_image();
     while (!die_now) {
@@ -622,7 +626,9 @@
            clean_child_exit(0);
        }
 
-       (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(my_child_num), 
SERVER_READY, (request_rec *) NULL);
+        (void) ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(my_child_num),
+                                      AP_CHILD_TSLOT_FROM_ID(my_child_num),
+                                      SERVER_READY, (request_rec *)NULL);
 
        /*
         * Wait for an acceptable connection to arrive.
@@ -866,7 +872,9 @@
        child_main(slot);
     }
 
-    (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(slot), SERVER_STARTING, 
(request_rec *) NULL);
+    (void) ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(slot),
+                                  AP_CHILD_TSLOT_FROM_ID(slot),
+                                  SERVER_STARTING, (request_rec *)NULL);
 
 
 #ifdef _OSD_POSIX
@@ -882,7 +890,9 @@
        /* fork didn't succeed. Fix the scoreboard or else
         * it will say SERVER_STARTING forever and ever
         */
-       (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(slot), SERVER_DEAD, 
(request_rec *) NULL);
+        (void) ap_update_child_status(AP_CHILD_PSLOT_FROM_ID(slot),
+                                      AP_CHILD_TSLOT_FROM_ID(slot),
+                                      SERVER_DEAD, (request_rec *) NULL);
 
        /* In case system resources are maxxed out, we don't want
           Apache running away with the CPU trying to fork over and
@@ -1187,8 +1197,10 @@
            ap_sync_scoreboard_image();
            child_slot = find_child_by_pid(&pid);
            if (child_slot >= 0) {
-               (void) ap_update_child_status(AP_CHILD_THREAD_FROM_ID(child_slot), 
SERVER_DEAD,
-                                           (request_rec *) NULL);
+                (void) ap_update_child_status(
+                           AP_CHILD_PSLOT_FROM_ID(child_slot),
+                           AP_CHILD_TSLOT_FROM_ID(child_slot),
+                           SERVER_DEAD, (request_rec *)NULL);
                if (remaining_children_to_start
                    && child_slot < ap_daemons_limit) {
                    /* we're still doing a 1-for-1 replacement of dead
Index: server/mpm/spmt_os2/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/spmt_os2/mpm_default.h,v
retrieving revision 1.6
diff -u -r1.6 mpm_default.h
--- server/mpm/spmt_os2/mpm_default.h   2001/02/16 04:26:51     1.6
+++ server/mpm/spmt_os2/mpm_default.h   2001/10/01 22:03:24
@@ -117,7 +117,11 @@
 #define DEFAULT_MAX_REQUESTS_PER_CHILD 10000
 #endif
 
-/* AP_CHILD_THREAD_FROM_ID is used by the scoreboard.  */
-#define AP_CHILD_THREAD_FROM_ID(i)       0, i
+/* AP_CHILD_PSLOT_FROM_ID and AP_CHILD_TSLOT_FROM_ID are
+ * used by the scoreboard. In our single-process model
+ * our single-child always uses slot 0.
+ */
+#define AP_CHILD_PSLOT_FROM_ID(i)       0
+#define AP_CHILD_TSLOT_FROM_ID(i)       i
 
 #endif /* AP_MPM_DEFAULT_H */
Index: server/mpm/threaded/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/threaded/mpm_default.h,v
retrieving revision 1.2
diff -u -r1.2 mpm_default.h
--- server/mpm/threaded/mpm_default.h   2001/02/22 18:54:45     1.2
+++ server/mpm/threaded/mpm_default.h   2001/10/01 22:03:24
@@ -60,7 +60,8 @@
 #define APACHE_MPM_DEFAULT_H
 
 #define AP_ID_FROM_CHILD_THREAD(c, t)    ((c * HARD_THREAD_LIMIT) + t)
-#define AP_CHILD_THREAD_FROM_ID(i)    (i / HARD_THREAD_LIMIT), (i % HARD_THREAD_LIMIT)
+#define AP_CHILD_PSLOT_FROM_ID(i)        (i / HARD_THREAD_LIMIT)
+#define AP_CHILD_TSLOT_FROM_ID(i)        (i % HARD_THREAD_LIMIT)
 
 /* Number of servers to spawn off by default --- also, if fewer than
  * this free when the caretaker checks, it will spawn more.
Index: server/mpm/winnt/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/winnt/mpm_default.h,v
retrieving revision 1.9
diff -u -r1.9 mpm_default.h
--- server/mpm/winnt/mpm_default.h      2001/02/16 04:26:52     1.9
+++ server/mpm/winnt/mpm_default.h      2001/10/01 22:03:25
@@ -59,8 +59,12 @@
 #ifndef APACHE_MPM_DEFAULT_H
 #define APACHE_MPM_DEFAULT_H
 
-/* AP_CHILD_THREAD_FROM_ID is used by the scoreboard.  */
-#define AP_CHILD_THREAD_FROM_ID(i)       0, i
+/* AP_CHILD_PSLOT_FROM_ID and AP_CHILD_TSLOT_FROM_ID are
+ * used by the scoreboard. In our single-process model
+ * our single-child always uses slot 0.
+ */
+#define AP_CHILD_PSLOT_FROM_ID(i)       0
+#define AP_CHILD_TSLOT_FROM_ID(i)       i
 
 /* Number of threads to spawn off by default --- also, if fewer than
  * this free when the caretaker checks, it will spawn more.
Index: server/mpm/worker/mpm_default.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/mpm/worker/mpm_default.h,v
retrieving revision 1.2
diff -u -r1.2 mpm_default.h
--- server/mpm/worker/mpm_default.h     2001/09/24 23:03:42     1.2
+++ server/mpm/worker/mpm_default.h     2001/10/01 22:03:25
@@ -60,7 +60,8 @@
 #define APACHE_MPM_DEFAULT_H
 
 #define AP_ID_FROM_CHILD_THREAD(c, t)    ((c * HARD_THREAD_LIMIT) + t)
-#define AP_CHILD_THREAD_FROM_ID(i)    (i / HARD_THREAD_LIMIT), (i % HARD_THREAD_LIMIT)
+#define AP_CHILD_PSLOT_FROM_ID(i)        (i / HARD_THREAD_LIMIT)
+#define AP_CHILD_TSLOT_FROM_ID(i)        (i % HARD_THREAD_LIMIT)
 
 /* Number of servers to spawn off by default --- also, if fewer than
  * this free when the caretaker checks, it will spawn more.
Index: modules/http/http_core.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/http/http_core.c,v
retrieving revision 1.285
diff -u -r1.285 http_core.c
--- modules/http/http_core.c    2001/09/30 04:17:16     1.285
+++ modules/http/http_core.c    2001/10/01 22:03:25
@@ -273,28 +273,30 @@
 static int ap_process_http_connection(conn_rec *c)
 {
     request_rec *r;
+    int pslot = AP_CHILD_PSLOT_FROM_ID(c->id);
+    int tslot = AP_CHILD_TSLOT_FROM_ID(c->id);
  
     /*
      * Read and process each request found on our connection
      * until no requests are left or we decide to close.
      */
  
-    ap_update_child_status(AP_CHILD_THREAD_FROM_ID(c->id), SERVER_BUSY_READ, NULL);
+    ap_update_child_status(pslot, tslot, SERVER_BUSY_READ, NULL);
     while ((r = ap_read_request(c)) != NULL) {
  
         /* process the request if it was read without error */
  
-        ap_update_child_status(AP_CHILD_THREAD_FROM_ID(c->id), SERVER_BUSY_WRITE, r);
+        ap_update_child_status(pslot, tslot, SERVER_BUSY_WRITE, r);
         if (r->status == HTTP_OK)
             ap_process_request(r);
  
         if (ap_extended_status)
-            ap_increment_counts(AP_CHILD_THREAD_FROM_ID(c->id), r);
+            ap_increment_counts(pslot, tslot, r);
  
         if (!c->keepalive || c->aborted)
             break;
  
-        ap_update_child_status(AP_CHILD_THREAD_FROM_ID(c->id), SERVER_BUSY_KEEPALIVE, 
r);
+        ap_update_child_status(pslot, tslot, SERVER_BUSY_KEEPALIVE, r);
         apr_pool_destroy(r->pool);
  
         if (ap_graceful_stop_signalled())

Reply via email to