Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / src / frontend / sock.c
index ce4c07ccd1017247ea21d4edfaddaf139b486177..0c4829e2efc4d3737fb9cf4a5f21cf3df5fa59b5 100644 (file)
@@ -452,10 +452,11 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop)
        int max_listen_fd = 0;
        size_t i;
 
-       /* XXX: make the number of threads configurable */
-       pthread_t handler_threads[5];
+       pthread_t handler_threads[loop->num_threads];
+       size_t num_threads;
 
-       if ((! sock) || (! sock->listeners_num) || (! loop) || sock->chan)
+       if ((! sock) || (! sock->listeners_num) || sock->chan
+                       || (! loop) || (loop->num_threads <= 0))
                return -1;
 
        if (! loop->do_loop)
@@ -481,13 +482,27 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop)
                return -1;
        }
 
+       sdb_log(SDB_LOG_INFO, "frontend: Starting %d connection "
+                       "handler thread%s managing %d listener%s",
+                       loop->num_threads, loop->num_threads == 1 ? "" : "s",
+                       sock->listeners_num, sock->listeners_num == 1 ? "" : "s");
+
+       num_threads = loop->num_threads;
        memset(&handler_threads, 0, sizeof(handler_threads));
-       /* XXX: error handling */
-       for (i = 0; i < SDB_STATIC_ARRAY_LEN(handler_threads); ++i)
-               pthread_create(&handler_threads[i], /* attr = */ NULL,
-                               connection_handler, /* arg = */ sock);
+       for (i = 0; i < num_threads; ++i) {
+               errno = 0;
+               if (pthread_create(&handler_threads[i], /* attr = */ NULL,
+                                       connection_handler, /* arg = */ sock)) {
+                       char errbuf[1024];
+                       sdb_log(SDB_LOG_ERR, "frontend: Failed to create "
+                                       "connection handler thread: %s",
+                                       sdb_strerror(errno, errbuf, sizeof(errbuf)));
+                       num_threads = i;
+                       break;
+               }
+       }
 
-       while (loop->do_loop) {
+       while (loop->do_loop && num_threads) {
                struct timeval timeout = { 1, 0 }; /* one second */
                sdb_llist_iter_t *iter;
 
@@ -543,12 +558,15 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop)
        sdb_log(SDB_LOG_INFO, "frontend: Waiting for connection handler threads "
                        "to terminate");
        if (! sdb_channel_shutdown(sock->chan))
-               for (i = 0; i < SDB_STATIC_ARRAY_LEN(handler_threads); ++i)
+               for (i = 0; i < num_threads; ++i)
                        pthread_join(handler_threads[i], NULL);
        /* else: we tried our best; let the operating system clean up */
 
        sdb_channel_destroy(sock->chan);
        sock->chan = NULL;
+
+       if (! num_threads)
+               return -1;
        return 0;
 } /* sdb_fe_sock_listen_and_server */