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 */