diff options
author | dimitri staessens <dimitri.staessens@ugent.be> | 2017-07-12 10:31:13 +0000 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@ugent.be> | 2017-07-12 10:31:13 +0000 |
commit | 3e9ee89b3ccf48dcabf7de2ecafcfbf637595cfe (patch) | |
tree | c2e257101d4f52190a5fc6e2e00e8b6d8d637932 /src/lib | |
parent | 9bbc7b4ba57a13e425fcfdfd6bd7ba5248255721 (diff) | |
parent | eaa2dff945366ed43b28fb1ae8e5c10ce95d9964 (diff) | |
download | ouroboros-3e9ee89b3ccf48dcabf7de2ecafcfbf637595cfe.tar.gz ouroboros-3e9ee89b3ccf48dcabf7de2ecafcfbf637595cfe.zip |
Merged in dstaesse/ouroboros/be-irmd-shutdown (pull request #527)
irmd: Shutdown sanitizer without cancellation
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/shm_rdrbuff.c | 31 |
1 files changed, 25 insertions, 6 deletions
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) |