From c5fb96870c8b4ade11b608c8a5fe6ebe3af6dd26 Mon Sep 17 00:00:00 2001 From: Thomas Porzelt Date: Fri, 15 Aug 2008 18:21:21 +0200 Subject: [PATCH] added event_handler setup; added srv->loop_flags; moved loop initialization to server_loop_init(); added ev_backend_string() to utils.c --- src/lighttpd.c | 1 + src/plugin_core.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++ src/server.c | 23 +++++++++++++------- src/server.h | 2 ++ src/utils.c | 14 +++++++++++++ src/utils.h | 2 ++ 6 files changed, 87 insertions(+), 8 deletions(-) diff --git a/src/lighttpd.c b/src/lighttpd.c index aefec68..6070f90 100644 --- a/src/lighttpd.c +++ b/src/lighttpd.c @@ -113,6 +113,7 @@ int main(int argc, char *argv[]) { log_warning(srv, NULL, "test %s", "foo2"); log_debug(srv, NULL, "test %s", "message"); + server_loop_init(srv); server_start(srv); server_free(srv); diff --git a/src/plugin_core.c b/src/plugin_core.c index 0047141..f651254 100644 --- a/src/plugin_core.c +++ b/src/plugin_core.c @@ -178,6 +178,7 @@ static action_result core_handle_test(server *srv, connection *con, gpointer par gpointer k, v; GList *hv; GString *str; + gchar *backend; guint64 uptime; guint64 avg1, avg2, avg3; gchar suffix1[2] = {0,0}, suffix2[2] = {0,0}, suffix3[2] = {0,0}; @@ -218,6 +219,10 @@ static action_result core_handle_test(server *srv, connection *con, gpointer par g_string_printf(str, "%"G_GUINT64_FORMAT"%s (%"G_GUINT64_FORMAT"%s/s)", avg1, suffix1, avg2, suffix2); chunkqueue_append_string(con->out, str); + backend = ev_backend_string(ev_backend(srv->loop)); + chunkqueue_append_mem(con->out, CONST_STR_LEN("\r\nevent handler: ")); + chunkqueue_append_mem(con->out, backend, strlen(backend)); + chunkqueue_append_mem(con->out, CONST_STR_LEN("\r\n\r\n--- headers ---\r\n")); g_hash_table_iter_init(&iter, con->request.headers->table); while (g_hash_table_iter_next(&iter, &k, &v)) { @@ -307,6 +312,53 @@ static gboolean core_listen(server *srv, plugin* p, option *opt) { } +static gboolean core_event_handler(server *srv, plugin* p, option *opt) { + guint backend; + gchar *str; + UNUSED(p); + + if (opt->type != OPTION_STRING) { + ERROR(srv, "%s", "event_handler expects a string as parameter"); + return FALSE; + } + + str = opt->value.opt_string->str; + backend = 0; /* libev will chose the right one by default */ + + if (g_str_equal(str, "select")) + backend = EVBACKEND_SELECT; + else if (g_str_equal(str, "poll")) + backend = EVBACKEND_POLL; + else if (g_str_equal(str, "epoll")) + backend = EVBACKEND_EPOLL; + else if (g_str_equal(str, "kqueue")) + backend = EVBACKEND_KQUEUE; + else if (g_str_equal(str, "devpoll")) + backend = EVBACKEND_DEVPOLL; + else if (g_str_equal(str, "port")) + backend = EVBACKEND_PORT; + else { + ERROR(srv, "unkown event handler: '%s'", str); + return FALSE; + } + + if (backend) { + if (!(ev_supported_backends() & backend)) { + ERROR(srv, "unsupported event handler: '%s'", str); + return FALSE; + } + + if (!(ev_recommended_backends() & backend)) { + TRACE(srv, "warning: event handler '%s' not recommended for this platform!", str); + } + } + + srv->loop_flags |= backend; + + return TRUE; +} + + gboolean core_option_log_target_parse(server *srv, plugin *p, size_t ndx, option *opt, gpointer *value) { log_t *log; log_type_t log_type; @@ -380,6 +432,7 @@ static const plugin_action actions[] = { static const plugin_setup setups[] = { { "listen", core_listen }, + { "event_handler", core_event_handler }, { NULL, NULL } }; diff --git a/src/server.c b/src/server.c index 250591f..6821657 100644 --- a/src/server.c +++ b/src/server.c @@ -91,14 +91,6 @@ server* server_new() { srv->magic = LIGHTTPD_SERVER_MAGIC; srv->state = SERVER_STARTING; - srv->loop = ev_default_loop (0); - if (!srv->loop) { - fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); - } - - CATCH_SIGNAL(srv->loop, sigint_cb, INT); - CATCH_SIGNAL(srv->loop, sigint_cb, TERM); - CATCH_SIGNAL(srv->loop, sigpipe_cb, PIPE); srv->connections_active = 0; srv->connections = g_array_new(FALSE, TRUE, sizeof(connection*)); @@ -194,6 +186,21 @@ void server_free(server* srv) { g_slice_free(server, srv); } +gboolean server_loop_init(server *srv) { + srv->loop = ev_default_loop(srv->loop_flags); + + if (!srv->loop) { + fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); + return FALSE; + } + + CATCH_SIGNAL(srv->loop, sigint_cb, INT); + CATCH_SIGNAL(srv->loop, sigint_cb, TERM); + CATCH_SIGNAL(srv->loop, sigpipe_cb, PIPE); + + return TRUE; +} + static connection* con_get(server *srv) { connection *con; if (srv->connections_active >= srv->connections->len) { diff --git a/src/server.h b/src/server.h index 9b4c41b..8b3944d 100644 --- a/src/server.h +++ b/src/server.h @@ -37,6 +37,7 @@ struct server { guint32 magic; /** server magic version, check against LIGHTTPD_SERVER_MAGIC in plugins */ server_state state; + guint loop_flags; struct ev_loop *loop; guint connections_active; /** 0..con_act-1: active connections, con_act..used-1: free connections */ @@ -80,6 +81,7 @@ struct server { LI_API server* server_new(); LI_API void server_free(server* srv); +LI_API gboolean server_loop_init(server *srv); LI_API void server_listen(server *srv, int fd); diff --git a/src/utils.c b/src/utils.c index 4ab8e31..0c0c1d3 100644 --- a/src/utils.c +++ b/src/utils.c @@ -255,3 +255,17 @@ gchar counter_format(guint64 *count, guint factor) { return suffix; } + +gchar *ev_backend_string(guint backend) { + switch (backend) { + case EVBACKEND_SELECT: return "select"; + case EVBACKEND_POLL: return "poll"; + case EVBACKEND_EPOLL: return "epoll"; + case EVBACKEND_KQUEUE: return "kqueue"; + case EVBACKEND_DEVPOLL: return "devpoll"; + case EVBACKEND_PORT: return "port"; + default: return "unknown"; + } +} + + diff --git a/src/utils.h b/src/utils.h index 38093c9..052bc36 100644 --- a/src/utils.h +++ b/src/utils.h @@ -22,4 +22,6 @@ LI_API gchar *http_status_string(guint status_code); /* */ LI_API gchar counter_format(guint64 *count, guint factor); +LI_API gchar *ev_backend_string(guint backend); + #endif