Attached is a patch against the 1.3b sources, to set the event_base* for
both the evhttp server and client connections.

It adds the following functions to the API:
evhttp_base_start
evhttp_base_connection_new

Only lightly tested, but it passes the regress tests.

Thoughts?

Thanks,

-Paul

Index: http.c
===================================================================
--- http.c      (revision 13656)
+++ http.c      (working copy)
@@ -150,6 +150,15 @@
 void evhttp_read(int, short, void *);
 void evhttp_write(int, short, void *);
 
+static int evhttp_null_base_set(struct event_base *base, struct event *ev)
+{
+       if (base != NULL) {
+               return event_base_set(base, ev);
+       }
+       
+       return (0);
+}
+
 #ifndef HAVE_STRSEP
 static char *
 strsep(char **s, const char *del)
@@ -277,6 +286,7 @@
                event_del(&evcon->ev);
 
        event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_write, evcon);
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
        evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_WRITE_TIMEOUT);
 }
 
@@ -706,6 +716,7 @@
        }
        /* Read more! */
        event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read, evcon);
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
        evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
 }
 
@@ -862,6 +873,7 @@
                event_del(&evcon->close_ev);
        event_set(&evcon->close_ev, evcon->fd, EV_READ,
            evhttp_detect_close_cb, evcon);
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
        event_add(&evcon->close_ev, NULL);
 }
 
@@ -1349,6 +1361,12 @@
 struct evhttp_connection *
 evhttp_connection_new(const char *address, unsigned short port)
 {
+       return evhttp_base_connection_new(NULL, address, port);
+}
+
+struct evhttp_connection *
+evhttp_base_connection_new(struct event_base *evb, const char *address, 
unsigned short port)
+{
        struct evhttp_connection *evcon = NULL;
        
        event_debug(("Attempting connection to %s:%d\n", address, port));
@@ -1360,6 +1378,8 @@
 
        evcon->fd = -1;
        evcon->port = port;
+    
+       evcon->base_ev = evb;
 
        evcon->timeout = -1;
        evcon->retry_cnt = evcon->retry_max = 0;
@@ -1382,6 +1402,8 @@
        evcon->state = EVCON_DISCONNECTED;
        TAILQ_INIT(&evcon->requests);
 
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
+       
        return (evcon);
        
  error:
@@ -1441,6 +1463,7 @@
 
        /* Set up a callback for successful connection setup */
        event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_connectioncb, evcon);
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
        evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_CONNECT_TIMEOUT);
 
        evcon->state = EVCON_CONNECTING;
@@ -1506,7 +1529,7 @@
        if (event_initialized(&evcon->ev))
                event_del(&evcon->ev);
        event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read_header, evcon);
-       
+       evhttp_null_base_set(evcon->base_ev, &evcon->ev);
        evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
 }
 
@@ -1883,6 +1906,7 @@
 
        /* Schedule the socket for accepting */
        event_set(ev, fd, EV_READ | EV_PERSIST, accept_socket, http);
+       evhttp_null_base_set(http->base_ev, ev);
        event_add(ev, NULL);
 
        event_debug(("Bound to port %d - Awaiting connections ... ", port));
@@ -1897,6 +1921,12 @@
 struct evhttp *
 evhttp_start(const char *address, u_short port)
 {
+       return evhttp_base_start(NULL, address, port);
+}
+
+struct evhttp *
+evhttp_base_start(struct event_base *evb, const char *address, u_short port)
+{
        struct evhttp *http;
 
        if ((http = calloc(1, sizeof(struct evhttp))) == NULL) {
@@ -1904,6 +1934,8 @@
                return (NULL);
        }
 
+       http->base_ev =  evb;
+       
        http->timeout = -1;
 
        TAILQ_INIT(&http->callbacks);
@@ -2073,7 +2105,7 @@
 
 static struct evhttp_connection*
 evhttp_get_request_connection(
-       int fd, struct sockaddr *sa, socklen_t salen)
+       struct evhttp *http, int fd, struct sockaddr *sa, socklen_t salen)
 {
        struct evhttp_connection *evcon;
        char *hostname, *portname;
@@ -2083,7 +2115,7 @@
                        __func__, hostname, portname, fd));
 
        /* we need a connection object to put the http request on */
-       if ((evcon = evhttp_connection_new(hostname, atoi(portname))) == NULL)
+       if ((evcon = evhttp_base_connection_new(http->base_ev, hostname, 
atoi(portname))) == NULL)
                return (NULL);
        evcon->flags |= EVHTTP_CON_INCOMING;
        evcon->state = EVCON_CONNECTED;
@@ -2123,7 +2155,7 @@
 {
        struct evhttp_connection *evcon;
 
-       evcon = evhttp_get_request_connection(fd, sa, salen);
+       evcon = evhttp_get_request_connection(http, fd, sa, salen);
        if (evcon == NULL)
                return;
 
Index: evhttp.h
===================================================================
--- evhttp.h    (revision 13656)
+++ evhttp.h    (working copy)
@@ -64,6 +64,7 @@
 
 /* Start an HTTP server on the specified address and port */
 struct evhttp *evhttp_start(const char *address, u_short port);
+struct evhttp *evhttp_base_start(struct event_base *evb, const char *address, 
u_short port);
 
 /*
  * Free the previously create HTTP server.  Works only if no requests are
@@ -168,6 +169,8 @@
  */
 struct evhttp_connection *evhttp_connection_new(
        const char *address, unsigned short port);
+struct evhttp_connection *evhttp_base_connection_new(
+       struct event_base *evb, const char *address, unsigned short port);
 
 /* Frees an http connection */
 void evhttp_connection_free(struct evhttp_connection *evcon);
Index: http-internal.h
===================================================================
--- http-internal.h     (revision 13656)
+++ http-internal.h     (working copy)
@@ -44,6 +44,7 @@
        struct event close_ev;
        struct evbuffer *input_buffer;
        struct evbuffer *output_buffer;
+       struct event_base *base_ev;
        
        char *address;
        u_short port;
@@ -81,6 +82,7 @@
 };
 
 struct evhttp {
+       struct event_base *base_ev;
        struct event bind_ev;
 
        TAILQ_HEAD(httpcbq, evhttp_cb) callbacks;
_______________________________________________
Libevent-users mailing list
[email protected]
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to