]> granicus.if.org Git - apache/commitdiff
server/mpm/simple/simple_run.c
authorPaul Querna <pquerna@apache.org>
Sun, 28 Jun 2009 08:13:43 +0000 (08:13 +0000)
committerPaul Querna <pquerna@apache.org>
Sun, 28 Jun 2009 08:13:43 +0000 (08:13 +0000)
    (simple_setup_pollcb): Only pollcbs created using KQueue, EPoll or Event Ports operate correctly with removing sockets across threads.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@789064 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/simple/simple_run.c

index 3ac7046943deed51b5c1c8f6e402f21fb4e581b4..a1864ce671dfdc83c337f7bf865ca5feffcfa3ba 100644 (file)
@@ -254,14 +254,18 @@ static int simple_setup_privs(simple_core_t * sc)
 
 static int simple_setup_pollcb(simple_core_t * sc)
 {
+    int i;
     apr_status_t rv;
+    int good_methods[] = {APR_POLLSET_KQUEUE, APR_POLLSET_PORT, APR_POLLSET_EPOLL};
 
-    rv = apr_pollcb_create(&sc->pollcb, 512 /* pqXXXXX: make configrable */ ,
-                           sc->pool, 0);
-    
+    for (i = 0; i < sizeof(good_methods) / sizeof(void*); i++) {
+        /* pqXXXXX: make size of pollcb configrable or dynamic */
+        rv = apr_pollcb_create_ex(&sc->pollcb, 512,
+                                  sc->pool, APR_POLLSET_NODEFAULT, good_methods[i]);
+    }
     if (rv) {
         ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
-                     "simple_setup_pollcb: apr_pollcb_create failed.");
+                   "simple_setup_pollcb: apr_pollcb_create failed for all possible backends!");
         return rv;
     }
     return rv;