You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by pq...@apache.org on 2007/11/14 09:27:45 UTC

svn commit: r594796 - in /httpd/sandbox/amsterdam/d: acinclude.m4 configure.in modules/proxy/config.m4 server/mpm/experimental/event/event.c

Author: pquerna
Date: Wed Nov 14 00:27:44 2007
New Revision: 594796

URL: http://svn.apache.org/viewvc?rev=594796&view=rev
Log:
Integrae serf's event loop into the Event MPM core event loop.

In theory, with a little more work, you could power mod_serf from the Event MPM's event loop.....

Modified:
    httpd/sandbox/amsterdam/d/acinclude.m4
    httpd/sandbox/amsterdam/d/configure.in
    httpd/sandbox/amsterdam/d/modules/proxy/config.m4
    httpd/sandbox/amsterdam/d/server/mpm/experimental/event/event.c

Modified: httpd/sandbox/amsterdam/d/acinclude.m4
URL: http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/acinclude.m4?rev=594796&r1=594795&r2=594796&view=diff
==============================================================================
--- httpd/sandbox/amsterdam/d/acinclude.m4 (original)
+++ httpd/sandbox/amsterdam/d/acinclude.m4 Wed Nov 14 00:27:44 2007
@@ -603,3 +603,38 @@
     AC_MSG_ERROR([Size of "void *" is less than size of "long"])
 fi
 ])
+
+
+
+
+AC_DEFUN([CHECK_SERF], [
+  AC_MSG_CHECKING(for serf)
+  serf_found="no"
+  AC_ARG_WITH(serf, APACHE_HELP_STRING([--with-serf=PREFIX],
+                                  [Serf client library]),
+  [
+    if test "$withval" = "yes" ; then
+      AC_MSG_ERROR([--with-serf requires an argument.])
+    else
+      AC_MSG_NOTICE([serf library configuration])
+      serf_prefix=$withval
+      save_cppflags="$CPPFLAGS"
+      CPPFLAGS="$CPPFLAGS $APR_INCLUDES $APU_INCLUDES -I$serf_prefix/include/serf-0"
+      AC_CHECK_HEADERS(serf.h,[
+        save_ldflags="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -L$serf_prefix/lib"
+        AC_CHECK_LIB(serf-0, serf_context_create,[serf_found="yes"])
+        LDFLAGS="$save_ldflags"])
+      CPPFLAGS="$save_cppflags"
+    fi
+  ])
+  
+  if test "$serf_found" = "yes"; then
+    APR_ADDTO(LDFLAGS, ["-L$serf_prefix/lib"])
+    APR_ADDTO(LIBS, ["-lserf-0"])
+    APR_ADDTO(INCLUDES, ["-I$serf_prefix/include/serf-0"])
+  else
+    AC_MSG_ERROR(unable to find serf)
+  fi
+])
+

Modified: httpd/sandbox/amsterdam/d/configure.in
URL: http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/configure.in?rev=594796&r1=594795&r2=594796&view=diff
==============================================================================
--- httpd/sandbox/amsterdam/d/configure.in (original)
+++ httpd/sandbox/amsterdam/d/configure.in Wed Nov 14 00:27:44 2007
@@ -212,6 +212,8 @@
 APR_ADDTO(INCLUDES, `$apr_config --includes`)
 APR_ADDTO(INCLUDES, `$apu_config --includes`)
 
+CHECK_SERF
+
 echo $ac_n "${nl}Applying OS-specific hints for httpd ...${nl}"
 
 case $host in

Modified: httpd/sandbox/amsterdam/d/modules/proxy/config.m4
URL: http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/modules/proxy/config.m4?rev=594796&r1=594795&r2=594796&view=diff
==============================================================================
--- httpd/sandbox/amsterdam/d/modules/proxy/config.m4 (original)
+++ httpd/sandbox/amsterdam/d/modules/proxy/config.m4 Wed Nov 14 00:27:44 2007
@@ -40,37 +40,6 @@
 APACHE_MODULE(proxy_ajp, Apache proxy AJP module, $proxy_ajp_objs, , $proxy_mods_enable)
 APACHE_MODULE(proxy_balancer, Apache proxy BALANCER module, $proxy_balancer_objs, , $proxy_mods_enable)
 
-AC_DEFUN([CHECK_SERF], [
-  AC_MSG_CHECKING(for serf)
-  serf_found="no"
-  AC_ARG_WITH(serf, APACHE_HELP_STRING([--with-serf=PREFIX],
-                                  [Serf client library]),
-  [
-    if test "$withval" = "yes" ; then
-      AC_MSG_ERROR([--with-serf requires an argument.])
-    else
-      AC_MSG_NOTICE([serf library configuration])
-      serf_prefix=$withval
-      save_cppflags="$CPPFLAGS"
-      CPPFLAGS="$CPPFLAGS $APR_INCLUDES $APU_INCLUDES -I$serf_prefix/include/serf-0"
-      AC_CHECK_HEADERS(serf.h,[
-        save_ldflags="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -L$serf_prefix/lib"
-        AC_CHECK_LIB(serf-0, serf_context_create,[serf_found="yes"])
-        LDFLAGS="$save_ldflags"])
-      CPPFLAGS="$save_cppflags"
-    fi
-  ])
-  
-  if test "$serf_found" = "yes"; then
-    APR_ADDTO(LDFLAGS, ["-L$serf_prefix/lib"])
-    APR_ADDTO(LIBS, ["-lserf-0"])
-    APR_ADDTO(INCLUDES, ["-I$serf_prefix/include/serf-0"])
-  else
-    AC_MSG_ERROR(unable to find serf)
-  fi
-])
-
 serf_objects="mod_serf.lo"
 APACHE_MODULE(serf, [Reverse proxy module using Serf], $serf_objects, , no, [
     CHECK_SERF

Modified: httpd/sandbox/amsterdam/d/server/mpm/experimental/event/event.c
URL: http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/server/mpm/experimental/event/event.c?rev=594796&r1=594795&r2=594796&view=diff
==============================================================================
--- httpd/sandbox/amsterdam/d/server/mpm/experimental/event/event.c (original)
+++ httpd/sandbox/amsterdam/d/server/mpm/experimental/event/event.c Wed Nov 14 00:27:44 2007
@@ -96,6 +96,8 @@
 #include <signal.h>
 #include <limits.h>             /* for INT_MAX */
 
+#include "serf.h"
+
 /* Limit on the total --- clients will be locked out if more servers than
  * this are needed.  It is intended solely to keep the server from crashing
  * when things get out of hand.
@@ -168,6 +170,13 @@
 
 static apr_pollset_t *event_pollset;
 
+typedef struct {
+    apr_pollset_t *pollset;
+    apr_pool_t *pool;
+} s_baton_t;
+
+static serf_context_t *g_serf;
+
 /* The structure used to pass unique initialization info to each thread */
 typedef struct
 {
@@ -190,7 +199,8 @@
 typedef enum
 {
     PT_CSD,
-    PT_ACCEPT
+    PT_ACCEPT,
+    PT_SERF,
 } poll_type_e;
 
 typedef struct
@@ -765,8 +775,34 @@
      */
 }
 
+static apr_status_t s_socket_add(void *user_baton,
+                                 apr_pollfd_t *pfd,
+                                 void *serf_baton)
+{
+    s_baton_t *s = (s_baton_t*)user_baton;
+    /* XXXXX: recycle listener_poll_types */
+    listener_poll_type *pt =  apr_palloc(s->pool, sizeof(*pt));
+    
+    pt->type = PT_SERF;
+    pt->baton = serf_baton;
+    pfd->client_data = pt;
+    
+    return apr_pollset_add(s->pollset, pfd);
+}
+
+static apr_status_t s_socket_remove(void *user_baton,
+                                   apr_pollfd_t *pfd,
+                                   void *serf_baton)
+{
+    s_baton_t *s = (s_baton_t*)user_baton;
+
+    return apr_pollset_remove(s->pollset, pfd);
+}
+
+
 static apr_status_t init_pollset(apr_pool_t *p)
 {
+    s_baton_t *baton = NULL;
     apr_status_t rv;
     ap_listen_rec *lr;
     listener_poll_type *pt;
@@ -807,6 +843,16 @@
         apr_pollset_add(event_pollset, pfd);
     }
 
+    baton = apr_pcalloc(p, sizeof(*baton));
+    baton->pollset = event_pollset;
+    
+    /* FIXME: subpools, threads, reuse, etc. */
+    baton->pool = p;
+
+    g_serf = serf_context_create_ex(p, baton,
+                                    s_socket_add,
+                                    s_socket_remove);
+
     return APR_SUCCESS;
 }
 
@@ -992,7 +1038,7 @@
                     have_idle_worker = 0;
                 }
             }
-            else {
+            else if (pt->type == PT_ACCEPT) {
                 /* A Listener Socket is ready for an accept() */
 
                 lr = (ap_listen_rec *) pt->baton;
@@ -1054,6 +1100,12 @@
                     ap_push_pool(worker_queue_info, ptrans);
                 }
             }               /* if:else on pt->type */
+            else if (pt->type == PT_SERF) {
+                // send socket to serf.
+                // XXXXX: this doesn't require get_worker(&have_idle_worker)
+                serf_event_trigger(g_serf, pt->baton, out_pfd);
+            }
+
             out_pfd++;
             num--;
         }                   /* while for processing poll */