aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Hutter <jhutter@hsr.ch>2005-11-07 09:49:15 +0000
committerJan Hutter <jhutter@hsr.ch>2005-11-07 09:49:15 +0000
commita01f6c5ac7947a178b2f1f615edad089f12c28f4 (patch)
treeff73dd146372b303b5a6b25bfc003d8f44cdc1e6
parent71888239b807829e9e7d1caff7187e8bb16b3484 (diff)
downloadstrongswan-a01f6c5ac7947a178b2f1f615edad089f12c28f4.tar.bz2
strongswan-a01f6c5ac7947a178b2f1f615edad089f12c28f4.tar.xz
- cancelation points defined
-rw-r--r--Source/charon/event_queue.c11
-rw-r--r--Source/charon/job_queue.c1
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(&current_time,NULL);
long difference = time_difference(&current_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) */