diff options
author | Martin Willi <martin@strongswan.org> | 2007-10-19 19:40:53 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2007-10-19 19:40:53 +0000 |
commit | 0e0e7d5b712e6839e1ee930d9cad27bf16d6fce1 (patch) | |
tree | 6bf8555861a5d2763ab1b68d65d5e44b5447100c /src/manager/lib/dispatcher.c | |
parent | b82e823141dcf0992eace4c6da6008872516ca42 (diff) | |
download | strongswan-0e0e7d5b712e6839e1ee930d9cad27bf16d6fce1.tar.bz2 strongswan-0e0e7d5b712e6839e1ee930d9cad27bf16d6fce1.tar.xz |
request_t.redirect takes variable argument list
request_t.serve to serve non-template data
fixed dispatcher thread locking code
Diffstat (limited to 'src/manager/lib/dispatcher.c')
-rw-r--r-- | src/manager/lib/dispatcher.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/src/manager/lib/dispatcher.c b/src/manager/lib/dispatcher.c index df669ceb6..ce53d39ea 100644 --- a/src/manager/lib/dispatcher.c +++ b/src/manager/lib/dispatcher.c @@ -30,6 +30,7 @@ #include <signal.h> #include <unistd.h> +#include <debug.h> #include <utils/linked_list.h> typedef struct private_dispatcher_t private_dispatcher_t; @@ -122,8 +123,8 @@ typedef struct { session_t *session; /** condvar to wait for session */ pthread_cond_t cond; - /** number of threads waiting for session */ - int waiting; + /** TRUE if session is in use */ + bool in_use; /** last use of the session */ time_t used; } session_entry_t; @@ -164,7 +165,7 @@ static session_entry_t *session_entry_create(private_dispatcher_t *this) session_entry_t *entry; entry = malloc_thing(session_entry_t); - entry->waiting = 1; + entry->in_use = FALSE; pthread_cond_init(&entry->cond, NULL); entry->session = load_session(this); entry->used = time(NULL); @@ -228,11 +229,12 @@ static void dispatch(private_dispatcher_t *this) now = time(NULL); /* find session */ - iterator = this->sessions->create_iterator_locked(this->sessions, &this->mutex); + pthread_mutex_lock(&this->mutex); + iterator = this->sessions->create_iterator(this->sessions, TRUE); while (iterator->iterate(iterator, (void**)¤t)) { /* check all sessions for timeout */ - if (current->waiting == 0 && + if (!current->in_use && current->used < now - this->timeout) { iterator->remove(iterator); @@ -243,27 +245,24 @@ static void dispatch(private_dispatcher_t *this) streq(current->session->get_sid(current->session), sid)) { found = current; - found->waiting++; } } iterator->destroy(iterator); if (found) { /* wait until session is unused */ - pthread_mutex_lock(&this->mutex); - while (found->waiting > 1) + while (found->in_use) { pthread_cond_wait(&found->cond, &this->mutex); } - pthread_mutex_unlock(&this->mutex); } else { /* create a new session if not found */ found = session_entry_create(this); - pthread_mutex_lock(&this->mutex); this->sessions->insert_first(this->sessions, found); - pthread_mutex_unlock(&this->mutex); } + found->in_use = TRUE; + pthread_mutex_unlock(&this->mutex); /* start processing */ found->session->process(found->session, request); @@ -271,7 +270,7 @@ static void dispatch(private_dispatcher_t *this) /* release session */ pthread_mutex_lock(&this->mutex); - found->waiting--; + found->in_use = FALSE; pthread_cond_signal(&found->cond); pthread_mutex_unlock(&this->mutex); |