The attached patch allows an evhttp server to properly operate on an
alternative event_base that is set via a new interface evhttp_base_start(),
which is also added by this patch. Basically this makes the http.c
implementation apply the event_base present in the struct evhttp instance
associated with the evhttp_connection/evhttp_request whenever an event is
scheduled via event_set/event_add.
A separate patch will need to handle the evhttp clients.
--
paul
diff -u libevent-1.3e.002/evhttp.h libevent-1.3e.003/evhttp.h
--- libevent-1.3e.002/evhttp.h 2007-10-31 11:49:23.000000000 -0500
+++ libevent-1.3e.003/evhttp.h 2007-10-31 11:50:14.000000000 -0500
@@ -66,6 +66,8 @@
/* 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 *base, const char *address,
+ u_short port);
/*
* Free the previously create HTTP server. Works only if no requests are
diff -u libevent-1.3e.002/http.c libevent-1.3e.003/http.c
--- libevent-1.3e.002/http.c 2007-09-12 17:20:34.000000000 -0500
+++ libevent-1.3e.003/http.c 2007-10-31 11:55:43.000000000 -0500
@@ -247,6 +247,14 @@
}
static void
+evhttp_base_set(struct evhttp_connection *evcon, struct event *ev)
+{
+ if( evcon->http_server != 0
+ && evcon->http_server->bind_ev.ev_base != 0 )
+ event_base_set(evcon->http_server->bind_ev.ev_base, ev);
+}
+
+static void
evhttp_add_event(struct event *ev, int timeout, int default_timeout)
{
if (timeout != 0) {
@@ -275,6 +283,7 @@
event_del(&evcon->ev);
event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_write, evcon);
+ evhttp_base_set(evcon, &evcon->ev);
evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_WRITE_TIMEOUT);
}
@@ -730,6 +739,7 @@
}
/* Read more! */
event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read, evcon);
+ evhttp_base_set(evcon, &evcon->ev);
evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
}
@@ -886,6 +896,7 @@
event_del(&evcon->close_ev);
event_set(&evcon->close_ev, evcon->fd, EV_READ,
evhttp_detect_close_cb, evcon);
+ event_base_set(evcon->http_server->bind_ev.ev_base, &evcon->close_ev);
event_add(&evcon->close_ev, NULL);
}
@@ -952,6 +963,7 @@
cleanup:
if (evcon->retry_max < 0 || evcon->retry_cnt < evcon->retry_max) {
evtimer_set(&evcon->ev, evhttp_connection_retry, evcon);
+ evhttp_base_set(evcon, &evcon->ev);
evhttp_add_event(&evcon->ev, MIN(3600, 2 << evcon->retry_cnt),
HTTP_CONNECT_TIMEOUT);
evcon->retry_cnt++;
@@ -1474,6 +1486,7 @@
/* Set up a callback for successful connection setup */
event_set(&evcon->ev, evcon->fd, EV_WRITE, evhttp_connectioncb, evcon);
+ evhttp_base_set(evcon, &evcon->ev);
evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_CONNECT_TIMEOUT);
evcon->state = EVCON_CONNECTING;
@@ -1539,7 +1552,7 @@
if (event_initialized(&evcon->ev))
event_del(&evcon->ev);
event_set(&evcon->ev, evcon->fd, EV_READ, evhttp_read_header, evcon);
-
+ evhttp_base_set(evcon, &evcon->ev);
evhttp_add_event(&evcon->ev, evcon->timeout, HTTP_READ_TIMEOUT);
}
@@ -1918,7 +1931,8 @@
}
static int
-bind_socket(struct evhttp *http, const char *address, u_short port)
+bind_socket(struct event_base *base, struct evhttp *http,
+ const char *address, u_short port)
{
struct event *ev = &http->bind_ev;
int fd;
@@ -1933,6 +1947,7 @@
/* Schedule the socket for accepting */
event_set(ev, fd, EV_READ | EV_PERSIST, accept_socket, http);
+ event_base_set(base, ev);
event_add(ev, NULL);
event_debug(("Bound to port %d - Awaiting connections ... ", port));
@@ -1945,7 +1960,7 @@
*/
struct evhttp *
-evhttp_start(const char *address, u_short port)
+evhttp_base_start(struct event_base *base, const char *address, u_short port)
{
struct evhttp *http;
@@ -1959,7 +1974,7 @@
TAILQ_INIT(&http->callbacks);
TAILQ_INIT(&http->connections);
- if (bind_socket(http, address, port) == -1) {
+ if (bind_socket(base, http, address, port) == -1) {
free(http);
return (NULL);
}
@@ -1967,6 +1982,12 @@
return (http);
}
+struct evhttp *
+evhttp_start(const char *address, u_short port)
+{
+ return evhttp_base_start(NULL, address, port);
+}
+
void
evhttp_free(struct evhttp* http)
{
_______________________________________________
Libevent-users mailing list
[email protected]
http://monkey.org/mailman/listinfo/libevent-users