diff options
author | Jan Hutter <jhutter@hsr.ch> | 2005-11-07 09:49:15 +0000 |
---|---|---|
committer | Jan Hutter <jhutter@hsr.ch> | 2005-11-07 09:49:15 +0000 |
commit | a01f6c5ac7947a178b2f1f615edad089f12c28f4 (patch) | |
tree | ff73dd146372b303b5a6b25bfc003d8f44cdc1e6 | |
parent | 71888239b807829e9e7d1caff7187e8bb16b3484 (diff) | |
download | strongswan-a01f6c5ac7947a178b2f1f615edad089f12c28f4.tar.bz2 strongswan-a01f6c5ac7947a178b2f1f615edad089f12c28f4.tar.xz |
- cancelation points defined
-rw-r--r-- | Source/charon/event_queue.c | 11 | ||||
-rw-r--r-- | Source/charon/job_queue.c | 1 |
2 files changed, 12 insertions, 0 deletions
diff --git a/Source/charon/event_queue.c b/Source/charon/event_queue.c index 703a3a8a6..02deb19ba 100644 --- a/Source/charon/event_queue.c +++ b/Source/charon/event_queue.c @@ -166,6 +166,7 @@ static status_t get(private_event_queue_t *this, job_t **job) timeval_t current_time; event_t * next_event; int count; + int oldstate; pthread_mutex_lock(&(this->mutex)); @@ -174,11 +175,21 @@ static status_t get(private_event_queue_t *this, job_t **job) 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); } this->list->get_first(this->list,(void **) &next_event); + gettimeofday(¤t_time,NULL); long difference = time_difference(¤t_time,&(next_event->time)); if (difference <= 0) diff --git a/Source/charon/job_queue.c b/Source/charon/job_queue.c index 3844004a1..ed370ed2c 100644 --- a/Source/charon/job_queue.c +++ b/Source/charon/job_queue.c @@ -82,6 +82,7 @@ static status_t get(private_job_queue_t *this, job_t **job) /* 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) */ |