From eaa2dff945366ed43b28fb1ae8e5c10ce95d9964 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Wed, 12 Jul 2017 12:16:34 +0200 Subject: irmd: Shutdown sanitizer without cancellation --- include/ouroboros/shm_rdrbuff.h | 4 +++- src/irmd/main.c | 9 +++------ src/lib/shm_rdrbuff.c | 31 +++++++++++++++++++++++++------ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/include/ouroboros/shm_rdrbuff.h b/include/ouroboros/shm_rdrbuff.h index fb12be74..1af8d0c9 100644 --- a/include/ouroboros/shm_rdrbuff.h +++ b/include/ouroboros/shm_rdrbuff.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -41,7 +42,8 @@ void shm_rdrbuff_close(struct shm_rdrbuff * rdrb); void shm_rdrbuff_destroy(struct shm_rdrbuff * rdrb); -void shm_rdrbuff_wait_full(struct shm_rdrbuff * rdrb); +int shm_rdrbuff_wait_full(struct shm_rdrbuff * rdrb, + struct timespec * timeo); /* returns the index of the buffer in the DU map */ ssize_t shm_rdrbuff_write(struct shm_rdrbuff * rdrb, diff --git a/src/irmd/main.c b/src/irmd/main.c index b2e6ba9c..db6f33de 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1514,8 +1514,9 @@ void * shm_sanitize(void * o) (void) o; - while (true) { - shm_rdrbuff_wait_full(irmd.rdrb); + while (irmd_get_state() == IRMD_RUNNING) { + if (shm_rdrbuff_wait_full(irmd.rdrb, &ts) == -ETIMEDOUT) + continue; pthread_rwlock_wrlock(&irmd.flows_lock); @@ -1536,8 +1537,6 @@ void * shm_sanitize(void * o) } pthread_rwlock_unlock(&irmd.flows_lock); - - nanosleep(&ts, NULL); } return (void *) 0; @@ -2247,8 +2246,6 @@ int main(int argc, pthread_join(irmd.tpm, NULL); pthread_join(irmd.irm_sanitize, NULL); - - pthread_cancel(irmd.shm_sanitize); pthread_join(irmd.shm_sanitize, NULL); pthread_sigmask(SIG_BLOCK, &sigset, NULL); diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c index ed9c3847..1f999f93 100644 --- a/src/lib/shm_rdrbuff.c +++ b/src/lib/shm_rdrbuff.c @@ -264,8 +264,15 @@ struct shm_rdrbuff * shm_rdrbuff_open() return rdrb; } -void shm_rdrbuff_wait_full(struct shm_rdrbuff * rdrb) +int shm_rdrbuff_wait_full(struct shm_rdrbuff * rdrb, + struct timespec * timeo) { + struct timespec abstime; + + if (timeo != NULL) { + clock_gettime(PTHREAD_COND_CLOCK, &abstime); + ts_add(&abstime, timeo, &abstime); + } #ifdef __APPLE__ pthread_mutex_lock(rdrb->lock); @@ -273,21 +280,33 @@ void shm_rdrbuff_wait_full(struct shm_rdrbuff * rdrb) if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) pthread_mutex_consistent(rdrb->lock); #endif - pthread_cleanup_push((void (*)(void *)) pthread_mutex_unlock, - (void *) rdrb->lock); while (shm_rdrb_free(rdrb, WAIT_BLOCKS)) { #ifdef __APPLE__ - pthread_cond_wait(rdrb->full, rdrb->lock); + if (pthread_cond_timedwait(rdrb->full, + rdrb->lock + &abstime) == ETIMEDOUT) { + pthread_mutex_unlock(rdrb->lock); + return -ETIMEDOUT; + } #else - if (pthread_cond_wait(rdrb->full, rdrb->lock) == EOWNERDEAD) + int ret = pthread_cond_timedwait(rdrb->full, + rdrb->lock, + &abstime); + if (ret == EOWNERDEAD) pthread_mutex_consistent(rdrb->lock); + if (ret == ETIMEDOUT) { + pthread_mutex_unlock(rdrb->lock); + return -ETIMEDOUT; + } #endif } garbage_collect(rdrb); - pthread_cleanup_pop(true); + pthread_mutex_unlock(rdrb->lock); + + return 0; } void shm_rdrbuff_close(struct shm_rdrbuff * rdrb) -- cgit v1.2.3