Mercurial > urweb
diff src/c/urweb.c @ 1707:c05e2e4bdde7
Refactor to avoid dependence on recursive mutexes
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sun, 08 Apr 2012 16:24:16 -0400 |
parents | 6f2f74cc4ead |
children | e263dab7b579 |
line wrap: on
line diff
--- a/src/c/urweb.c Thu Mar 29 11:23:35 2012 -0400 +++ b/src/c/urweb.c Sun Apr 08 16:24:16 2012 -0400 @@ -159,13 +159,7 @@ static client **clients, *clients_free, *clients_used; static unsigned n_clients; -static pthread_mutex_t clients_mutex = - #ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER - PTHREAD_RECURSIVE_MUTEX_INITIALIZER - #else - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP - #endif - ; +static pthread_mutex_t clients_mutex = PTHREAD_MUTEX_INITIALIZER; size_t uw_messages_max = SIZE_MAX; size_t uw_clients_max = SIZE_MAX; @@ -230,20 +224,22 @@ } static const char begin_msgs[] = "Content-type: text/plain\r\n\r\n"; +static pthread_t pruning_thread; +static int pruning_thread_initialized = 0; static client *find_client(unsigned id) { client *c; - pthread_mutex_lock(&clients_mutex); + if (!pruning_thread_initialized || !pthread_equal(pruning_thread, pthread_self())) pthread_mutex_lock(&clients_mutex); if (id >= n_clients) { - pthread_mutex_unlock(&clients_mutex); + if (!pruning_thread_initialized || !pthread_equal(pruning_thread, pthread_self())) pthread_mutex_unlock(&clients_mutex); return NULL; } c = clients[id]; - pthread_mutex_unlock(&clients_mutex); + if (!pruning_thread_initialized || !pthread_equal(pruning_thread, pthread_self())) pthread_mutex_unlock(&clients_mutex); return c; } @@ -3291,6 +3287,8 @@ cutoff = time(NULL) - ctx->app->timeout; pthread_mutex_lock(&clients_mutex); + pruning_thread = pthread_self(); + pruning_thread_initialized = 1; for (c = clients_used; c; c = next) { next = c->next;