From 4848a679018f9e864cd277345191ad8f1000b5ff Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 27 May 2012 21:11:29 +0000 Subject: [PATCH] use GNUNET_SCHEDULER_add_read_net_with_priority instead of constructing fd sets in server with only one active listen socket --- src/util/server.c | 79 ++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/src/util/server.c b/src/util/server.c index 3f1edf3ea..70f2a1a70 100644 --- a/src/util/server.c +++ b/src/util/server.c @@ -330,27 +330,66 @@ struct GNUNET_SERVER_Client * @param tc reason why we are running right now */ static void -process_listen_socket (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +process_listen_socket (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); + + +/** + * Add a listen task with the scheduler for this server. + * + * @param server handle to our server for which we are adding the listen + * socket + */ +static void +schedule_listen_task (struct GNUNET_SERVER_Handle *server) { - struct GNUNET_SERVER_Handle *server = cls; - struct GNUNET_CONNECTION_Handle *sock; - struct GNUNET_SERVER_Client *client; struct GNUNET_NETWORK_FDSet *r; unsigned int i; - server->listen_task = GNUNET_SCHEDULER_NO_TASK; + if (NULL == server->listen_sockets[0]) + return; /* nothing to do, no listen sockets! */ + if (NULL == server->listen_sockets[1]) + { + /* simplified method: no fd set needed; this is then much simpler and + much more efficient */ + server->listen_task = + GNUNET_SCHEDULER_add_read_net_with_priority (GNUNET_TIME_UNIT_FOREVER_REL, + GNUNET_SCHEDULER_PRIORITY_HIGH, + server->listen_sockets[0], + &process_listen_socket, server); + return; + } r = GNUNET_NETWORK_fdset_create (); i = 0; while (NULL != server->listen_sockets[i]) GNUNET_NETWORK_fdset_set (r, server->listen_sockets[i++]); + server->listen_task = + GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH, + GNUNET_TIME_UNIT_FOREVER_REL, r, NULL, + &process_listen_socket, server); + GNUNET_NETWORK_fdset_destroy (r); +} + + +/** + * Scheduler says our listen socket is ready. Process it! + * + * @param cls handle to our server for which we are processing the listen + * socket + * @param tc reason why we are running right now + */ +static void +process_listen_socket (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct GNUNET_SERVER_Handle *server = cls; + struct GNUNET_CONNECTION_Handle *sock; + struct GNUNET_SERVER_Client *client; + unsigned int i; + + server->listen_task = GNUNET_SCHEDULER_NO_TASK; if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) { /* ignore shutdown, someone else will take care of it! */ - server->listen_task = - GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH, - GNUNET_TIME_UNIT_FOREVER_REL, r, NULL, - &process_listen_socket, server); - GNUNET_NETWORK_fdset_destroy (r); + schedule_listen_task (server); return; } i = 0; @@ -373,11 +412,7 @@ process_listen_socket (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) i++; } /* listen for more! */ - server->listen_task = - GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH, - GNUNET_TIME_UNIT_FOREVER_REL, r, NULL, - &process_listen_socket, server); - GNUNET_NETWORK_fdset_destroy (r); + schedule_listen_task (server); } @@ -501,8 +536,6 @@ GNUNET_SERVER_create_with_sockets (GNUNET_CONNECTION_AccessCheck access, int require_found) { struct GNUNET_SERVER_Handle *server; - struct GNUNET_NETWORK_FDSet *r; - int i; server = GNUNET_malloc (sizeof (struct GNUNET_SERVER_Handle)); server->idle_timeout = idle_timeout; @@ -511,17 +544,7 @@ GNUNET_SERVER_create_with_sockets (GNUNET_CONNECTION_AccessCheck access, server->access_cls = access_cls; server->require_found = require_found; if (NULL != lsocks) - { - r = GNUNET_NETWORK_fdset_create (); - i = 0; - while (NULL != server->listen_sockets[i]) - GNUNET_NETWORK_fdset_set (r, server->listen_sockets[i++]); - server->listen_task = - GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH, - GNUNET_TIME_UNIT_FOREVER_REL, r, NULL, - &process_listen_socket, server); - GNUNET_NETWORK_fdset_destroy (r); - } + schedule_listen_task (server); return server; } -- 2.25.1