]> granicus.if.org Git - apache/blobdiff - server/mpm_common.c
APRize disabling nagle (setting TCP_NODELAY).
[apache] / server / mpm_common.c
index a7b46cc5dc573c54e9b6c72fd84f8183ad4d9c19..d77c66244092a3e3604a98939c916b26fc81f134 100644 (file)
 #include <sys/socket.h> /* for setsockopt prototype */
 #endif
 
-#if defined(DEXTER) || defined(DEXTER_MPM) || defined(MPMT_BEOS_MPM) || defined(BEOS_MPM)
-#define CHILD_TABLE 1
-#define CHILD_INFO_TABLE     ap_child_table
-#elif defined(MPMT_PTHREAD) || defined (PREFORK) || defined(PREFORK_MPM)
-#define SCOREBOARD 1
-#define CHILD_INFO_TABLE     ap_scoreboard_image->parent
-#endif 
-
-
-#ifdef CHILD_INFO_TABLE
+#ifdef MPM_NEEDS_RECLAIM_CHILD_PROCESSES
 void ap_reclaim_child_processes(int terminate)
 {
     int i;
     long int waittime = 1024 * 16;      /* in usecs */
-    ap_status_t waitret;
+    apr_status_t waitret;
     int tries;
     int not_dead_yet;
     int max_daemons = ap_get_max_daemons();
 
-#ifdef SCOREBOARD
-    ap_sync_scoreboard_image();
-#endif
+    MPM_SYNC_CHILD_TABLE();
 
     for (tries = terminate ? 4 : 1; tries <= 9; ++tries) {
         /* don't want to hold up progress any more than
@@ -110,29 +99,21 @@ void ap_reclaim_child_processes(int terminate)
          * Set delay with an exponential backoff.
          */
         waittime = waittime * 4;
-        ap_sleep(waittime);
+        apr_sleep(waittime);
 
         /* now see who is done */
         not_dead_yet = 0;
         for (i = 0; i < max_daemons; ++i) {
-            pid_t pid = CHILD_INFO_TABLE[i].pid;
-            ap_proc_t proc;
+            pid_t pid = MPM_CHILD_PID(i);
+            apr_proc_t proc;
 
-#ifdef CHILD_TABLE
-            if (ap_child_table[i].status == SERVER_DEAD)
-#elif defined(SCOREBOARD)
-            if (pid == ap_my_pid || pid == 0)
-#endif
+            if (pid == 0)
                 continue;
 
             proc.pid = pid;
-            waitret = ap_wait_proc(&proc, APR_NOWAIT);
+            waitret = apr_wait_proc(&proc, APR_NOWAIT);
             if (waitret != APR_CHILD_NOTDONE) {
-#ifdef CHILD_TABLE
-                ap_child_table[i].status = SERVER_DEAD;
-#elif defined(SCOREBOARD)
-                ap_scoreboard_image->parent[i].pid = 0;
-#endif
+                MPM_NOTE_CHILD_KILLED(i);
                 continue;
             }
             ++not_dead_yet;
@@ -183,14 +164,14 @@ void ap_reclaim_child_processes(int terminate)
                 break;
             }
         }
-        ap_check_other_child();
+        apr_check_other_child();
         if (!not_dead_yet) {
             /* nothing left to wait for */
             break;
         }
     }
 }
-#endif
+#endif /* NEED_RECLAIM_CHILD_PROCESSES */
 
 /* number of calls to wait_or_timeout between writable probes */
 #ifndef INTERVAL_OF_WRITABLE_PROBES
@@ -198,19 +179,19 @@ void ap_reclaim_child_processes(int terminate)
 #endif
 static int wait_or_timeout_counter;
 
-void ap_wait_or_timeout(ap_wait_t *status, ap_proc_t *ret, ap_pool_t *p)
+void ap_wait_or_timeout(apr_wait_t *status, apr_proc_t *ret, apr_pool_t *p)
 {
-    ap_status_t rv;
+    apr_status_t rv;
 
     ++wait_or_timeout_counter;
     if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) {
         wait_or_timeout_counter = 0;
 #if APR_HAS_OTHER_CHILD
-        ap_probe_writable_fds();
+        apr_probe_writable_fds();
 #endif
     }
-    rv = ap_wait_all_procs(ret, status, APR_NOWAIT, p);
-    if (ap_canonical_error(rv) == APR_EINTR) {
+    rv = apr_wait_all_procs(ret, status, APR_NOWAIT, p);
+    if (apr_canonical_error(rv) == APR_EINTR) {
         ret->pid = -1;
         return;
     }
@@ -222,12 +203,12 @@ void ap_wait_or_timeout(ap_wait_t *status, ap_proc_t *ret, ap_pool_t *p)
         return;
     }
 #endif
-    ap_sleep(SCOREBOARD_MAINTENANCE_INTERVAL);
+    apr_sleep(SCOREBOARD_MAINTENANCE_INTERVAL);
     ret->pid = -1;
     return;
 }
 
-void ap_process_child_status(ap_proc_t *pid, ap_wait_t status)
+void ap_process_child_status(apr_proc_t *pid, apr_wait_t status)
 {
     /* Child died... if it died due to a fatal error,
         * we should simply bail out.
@@ -280,7 +261,7 @@ void ap_process_child_status(ap_proc_t *pid, ap_wait_t status)
 }
 
 #if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
-void ap_sock_disable_nagle(int s)
+void ap_sock_disable_nagle(apr_socket_t *s)
 {
     /* The Nagle algorithm says that we should delay sending partial
      * packets in hopes of getting more data.  We don't want to do
@@ -291,11 +272,10 @@ void ap_sock_disable_nagle(int s)
      *
      * In spite of these problems, failure here is not a shooting offense.
      */
-    int just_say_no = 1;
+    apr_status_t status = apr_setsocketopt(s, APR_TCP_NODELAY, 1);
 
-    if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no,
-                   sizeof(int)) != APR_SUCCESS) {
-        ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf,
+    if (status != APR_SUCCESS) {
+        ap_log_error(APLOG_MARK, APLOG_WARNING, status, ap_server_conf,
                     "setsockopt: (TCP_NODELAY)");
     }
 }