summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--httpd.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/httpd.c b/httpd.c
index 37b4f02..d068af3 100644
--- a/httpd.c
+++ b/httpd.c
@@ -252,8 +252,6 @@ static void *purge_thread(void *arg)
static void *background_thread(void *arg)
/* background thread (queue management and other things) */
{
- pthread_mutex_t dummy_mutex = PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t dummy_cond = PTHREAD_COND_INITIALIZER;
time_t purge_time;
/* first purge time */
@@ -295,7 +293,10 @@ static void *background_thread(void *arg)
}
/* sleep 3 seconds */
+ pthread_mutex_t dummy_mutex = PTHREAD_MUTEX_INITIALIZER;
+ pthread_cond_t dummy_cond = PTHREAD_COND_INITIALIZER;
struct timespec ts;
+
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 3;
@@ -318,13 +319,18 @@ static void *connection_thread(void *arg)
}
+#ifndef MAX_THREADS
+#define MAX_THREADS 256
+#endif
+
void httpd(void)
/* starts the server */
{
char *address;
int port;
int rs;
- pthread_t htid;
+ pthread_t threads[MAX_THREADS];
+ int n_threads = 0;
address = xs_dict_get(srv_config, "address");
port = xs_number_get(xs_dict_get(srv_config, "port"));
@@ -338,11 +344,25 @@ void httpd(void)
signal(SIGPIPE, SIG_IGN);
signal(SIGTERM, term_handler);
- signal(SIGINT, term_handler);
+ signal(SIGINT, term_handler);
srv_log(xs_fmt("httpd start %s:%d %s", address, port, USER_AGENT));
- pthread_create(&htid, NULL, background_thread, NULL);
+ /* thread creation */
+#ifdef _SC_NPROCESSORS_ONLN
+ n_threads = sysconf(_SC_NPROCESSORS_ONLN);
+#endif
+
+ if (n_threads < 4)
+ n_threads = 4;
+
+ if (n_threads > MAX_THREADS)
+ n_threads = MAX_THREADS;
+
+ srv_debug(0, xs_fmt("using %d threads", n_threads));
+
+ /* thread #0 is the background thread */
+ pthread_create(&threads[0], NULL, background_thread, NULL);
if (setjmp(on_break) == 0) {
for (;;) {
@@ -357,8 +377,8 @@ void httpd(void)
srv_running = 0;
- /* wait for the helper thread to end */
- pthread_join(htid, NULL);
+ /* wait for the background thread to end */
+ pthread_join(threads[0], NULL);
srv_log(xs_fmt("httpd stop %s:%d", address, port));
}