diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/irmd/main.c | 9 | ||||
| -rw-r--r-- | src/lib/shm_rdrbuff.c | 31 | 
2 files changed, 28 insertions, 12 deletions
| 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) | 
