diff options
author | Martin Willi <martin@strongswan.org> | 2005-11-04 13:20:11 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2005-11-04 13:20:11 +0000 |
commit | db5dc986036b6e369925c7958ebee509714cbd9f (patch) | |
tree | b74324dc536ae301459b34e5ab88ac9af1dec0c5 | |
parent | bfdc5c7c93b0d5a7ed61892d686447ec94fb6405 (diff) | |
download | strongswan-db5dc986036b6e369925c7958ebee509714cbd9f.tar.bz2 strongswan-db5dc986036b6e369925c7958ebee509714cbd9f.tar.xz |
- cancellation disabled by default
-rw-r--r-- | Source/charon/job_queue.c | 15 | ||||
-rw-r--r-- | Source/charon/thread_pool.c | 4 |
2 files changed, 13 insertions, 6 deletions
diff --git a/Source/charon/job_queue.c b/Source/charon/job_queue.c index e4ab78c2f..14f0a4ed9 100644 --- a/Source/charon/job_queue.c +++ b/Source/charon/job_queue.c @@ -96,19 +96,22 @@ status_t get_count(private_job_queue_t *this, int *count) status_t get(private_job_queue_t *this, job_t **job) { int count; + int oldstate; pthread_mutex_lock(&(this->mutex)); - // add mutex unlock handler for cancellation - pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex)); - // go to wait while no jobs available + /* go to wait while no jobs available */ this->list->get_count(this->list,&count); while(count == 0) { + /* add mutex unlock handler for cancellation, enable cancellation */ + pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex)); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate); pthread_cond_wait( &(this->condvar), &(this->mutex)); + + /* reset cancellation, remove mutex-unlock handler (without executing) */ + pthread_setcancelstate(oldstate, NULL); + pthread_cleanup_pop(0); this->list->get_count(this->list,&count); } - // remove mutex-unlock handler (without executing) - pthread_cleanup_pop(0); - this->list->remove_first(this->list,(void **) job); pthread_mutex_unlock(&(this->mutex)); return SUCCESS; diff --git a/Source/charon/thread_pool.c b/Source/charon/thread_pool.c index 435e310cc..5ca43be1c 100644 --- a/Source/charon/thread_pool.c +++ b/Source/charon/thread_pool.c @@ -56,6 +56,9 @@ typedef struct { void job_processing(private_thread_pool_t *this) { + /* cancellation disabled by default */ + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); + for (;;) { job_t *job; job_queue->get(job_queue, &job); @@ -113,6 +116,7 @@ thread_pool_t *thread_pool_create(size_t pool_size) this->pool_size = pool_size; this->threads = alloc_bytes(sizeof(pthread_t) * pool_size, "pthread_t[] of private_thread_pool_t"); + /* try to create as many threads as possible, up tu pool_size */ for (current = 0; current < pool_size; current++) { if (pthread_create(&(this->threads[current]), NULL, (void*(*)(void*))job_processing, this)) { |