diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/irmd/main.c | 46 | ||||
| -rw-r--r-- | src/lib/shm_rdrbuff.c | 130 | 
2 files changed, 40 insertions, 136 deletions
| diff --git a/src/irmd/main.c b/src/irmd/main.c index 574223b0..aeb43f0d 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -134,7 +134,6 @@ struct {          struct tpm *         tpm;          /* thread pool manager        */          pthread_t            irm_sanitize; /* clean up irmd resources    */ -        pthread_t            shm_sanitize; /* keep track of rdrbuff use  */          pthread_t            acceptor;     /* accept new commands        */  } irmd; @@ -1683,43 +1682,6 @@ void irmd_sig_handler(int         sig,          }  } -void * shm_sanitize(void * o) -{ -        struct list_head * p = NULL; -        struct timespec ts = {SHM_SAN_HOLDOFF / 1000, -                              (SHM_SAN_HOLDOFF % 1000) * MILLION}; -        ssize_t idx; - -        (void) o; - -        while (irmd_get_state() == IRMD_RUNNING) { -                if (shm_rdrbuff_wait_full(irmd.rdrb, &ts) == -ETIMEDOUT) -                        continue; - -                pthread_rwlock_wrlock(&irmd.flows_lock); - -                list_for_each(p, &irmd.irm_flows) { -                        struct irm_flow * f = -                                list_entry(p, struct irm_flow, next); -                        if (kill(f->n_pid, 0) < 0) { -                                while ((idx = shm_rbuff_read(f->n_rb)) >= 0) -                                        shm_rdrbuff_remove(irmd.rdrb, idx); -                                continue; -                        } - -                        if (kill(f->n_1_pid, 0) < 0) { -                                while ((idx = shm_rbuff_read(f->n_1_rb)) >= 0) -                                        shm_rdrbuff_remove(irmd.rdrb, idx); -                                continue; -                        } -                } - -                pthread_rwlock_unlock(&irmd.flows_lock); -        } - -        return (void *) 0; -} -  void * irm_sanitize(void * o)  {          struct timespec now; @@ -2362,11 +2324,6 @@ int main(int     argc,                  goto fail_irm_sanitize;          } -        if (pthread_create(&irmd.shm_sanitize, NULL, shm_sanitize, irmd.rdrb)) { -                irmd_set_state(IRMD_NULL); -                goto fail_shm_sanitize; -        } -          if (pthread_create(&irmd.acceptor, NULL, acceptloop, NULL)) {                  irmd_set_state(IRMD_NULL);                  goto fail_acceptor; @@ -2374,7 +2331,6 @@ int main(int     argc,          pthread_join(irmd.acceptor, NULL);          pthread_join(irmd.irm_sanitize, NULL); -        pthread_join(irmd.shm_sanitize, NULL);          tpm_stop(irmd.tpm); @@ -2393,8 +2349,6 @@ int main(int     argc,          exit(EXIT_SUCCESS);   fail_acceptor: -        pthread_join(irmd.shm_sanitize, NULL); - fail_shm_sanitize:          pthread_join(irmd.irm_sanitize, NULL);   fail_irm_sanitize:          tpm_stop(irmd.tpm); diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c index 1dfcb2ca..5ae2085d 100644 --- a/src/lib/shm_rdrbuff.c +++ b/src/lib/shm_rdrbuff.c @@ -46,29 +46,17 @@                         + sizeof(pthread_mutex_t) + 2 * sizeof(pthread_cond_t)  \                         + sizeof(pid_t)) -#ifndef SHM_RDRB_MULTI_BLOCK -#define WAIT_BLOCKS 1 -#else -#define WAIT_BLOCKS ((SHM_BUFFER_SIZE) >> 4) -#if WAIT_BLOCKS == 0 -#undef WAIT_BLOCKS -#define WAIT_BLOCKS 1 -#endif -#endif -  #define get_head_ptr(rdrb)                                                     \ -        ((struct shm_du_buff *) (rdrb->shm_base + (*rdrb->head                 \ -                                                   * SHM_RDRB_BLOCK_SIZE))) +        idx_to_du_buff_ptr(rdrb, *rdrb->head)  #define get_tail_ptr(rdrb)                                                     \ -        ((struct shm_du_buff *) (rdrb->shm_base + (*rdrb->tail                 \ -                                                   * SHM_RDRB_BLOCK_SIZE))) +        idx_to_du_buff_ptr(rdrb, *rdrb->tail)  #define idx_to_du_buff_ptr(rdrb, idx)                                          \          ((struct shm_du_buff *) (rdrb->shm_base + idx * SHM_RDRB_BLOCK_SIZE))  #define shm_rdrb_used(rdrb)                                                    \ -        ((*rdrb->head + (SHM_BUFFER_SIZE) - *rdrb->tail)                       \ +        (((*rdrb->head + (SHM_BUFFER_SIZE) - *rdrb->tail) + 1)                 \           & ((SHM_BUFFER_SIZE) - 1))  #define shm_rdrb_free(rdrb, i)                                                 \ @@ -118,6 +106,13 @@ static void garbage_collect(struct shm_rdrbuff * rdrb)          pthread_cond_broadcast(rdrb->healthy);  } +static void sanitize(struct shm_rdrbuff * rdrb) +{ +        get_head_ptr(rdrb)->flags = SDB_NULL; +        garbage_collect(rdrb); +        pthread_mutex_consistent(rdrb->lock); +} +  static char * rdrb_filename(void)  {          char * str; @@ -282,51 +277,6 @@ struct shm_rdrbuff * shm_rdrbuff_open()          return rdrb_create(O_RDWR);  } -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); -        } - -#ifndef HAVE_ROBUST_MUTEX -        pthread_mutex_lock(rdrb->lock); -#else -        if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) -                pthread_mutex_consistent(rdrb->lock); -#endif - -        while (shm_rdrb_free(rdrb, WAIT_BLOCKS)) { -#ifndef HAVE_ROBUST_MUTEX -                if (pthread_cond_timedwait(rdrb->full, -                                           rdrb->lock, -                                           &abstime) == ETIMEDOUT) { -                        pthread_mutex_unlock(rdrb->lock); -                        return -ETIMEDOUT; -                } -#else -                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_mutex_unlock(rdrb->lock); - -        return 0; -} -  void shm_rdrbuff_purge(void)  {          char * shm_rdrb_fn; @@ -358,19 +308,19 @@ ssize_t shm_rdrbuff_write(struct shm_rdrbuff * rdrb,  #ifndef SHM_RDRB_MULTI_BLOCK          if (sz > SHM_RDRB_BLOCK_SIZE)                  return -EMSGSIZE; +#else +        while (sz > 0) { +                sz -= SHM_RDRB_BLOCK_SIZE; +                ++blocks; +        }  #endif  #ifndef HAVE_ROBUST_MUTEX          pthread_mutex_lock(rdrb->lock);  #else          if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) -                pthread_mutex_consistent(rdrb->lock); +                sanitize(rdrb);  #endif  #ifdef SHM_RDRB_MULTI_BLOCK -        while (sz > 0) { -                sz -= SHM_RDRB_BLOCK_SIZE; -                ++blocks; -        } -          if (blocks + *rdrb->head > (SHM_BUFFER_SIZE))                  padblocks = (SHM_BUFFER_SIZE) - *rdrb->head; @@ -426,39 +376,41 @@ ssize_t shm_rdrbuff_write_b(struct shm_rdrbuff *    rdrb,                              const struct timespec * abstime)  {          struct shm_du_buff * sdb; -        size_t               size = headspace + len + tailspace; +        size_t               size      = headspace + len + tailspace;  #ifdef SHM_RDRB_MULTI_BLOCK -        size_t               blocks = 0; +        size_t               blocks    = 0;          size_t               padblocks = 0; +        size_t               rblocks;  #endif -        ssize_t              sz = size + sizeof(*sdb); -        int                  ret = 0; +        ssize_t              sz        = size + sizeof(*sdb); +        int                  ret       = 0;          assert(rdrb);  #ifndef SHM_RDRB_MULTI_BLOCK          if (sz > SHM_RDRB_BLOCK_SIZE)                  return -EMSGSIZE; +#else +        while (sz > 0) { +                sz -= SHM_RDRB_BLOCK_SIZE; +                ++blocks; +        } +        rblocks = blocks;  #endif  #ifndef HAVE_ROBUST_MUTEX          pthread_mutex_lock(rdrb->lock);  #else          if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) -                pthread_mutex_consistent(rdrb->lock); +                sanitize(rdrb);  #endif          pthread_cleanup_push((void (*) (void *)) pthread_mutex_unlock,                               (void *) rdrb->lock);  #ifdef SHM_RDRB_MULTI_BLOCK -        while (sz > 0) { -                sz -= SHM_RDRB_BLOCK_SIZE; -                ++blocks; -        } +        if (blocks > 1) +                rblocks = blocks << 1; -        if (blocks + *rdrb->head > (SHM_BUFFER_SIZE)) -                padblocks = (SHM_BUFFER_SIZE) - *rdrb->head; - -        while (!shm_rdrb_free(rdrb, (blocks + padblocks)) && ret != ETIMEDOUT) { +        while (!shm_rdrb_free(rdrb, rblocks) && ret != ETIMEDOUT) {  #else          while (!shm_rdrb_free(rdrb, 1) && ret != ETIMEDOUT) {  #endif @@ -469,6 +421,11 @@ ssize_t shm_rdrbuff_write_b(struct shm_rdrbuff *    rdrb,                                                       abstime);                  else                          ret = pthread_cond_wait(rdrb->healthy, rdrb->lock); + +#ifdef SHM_RDRB_MULTI_BLOCK +                if (blocks + *rdrb->head > (SHM_BUFFER_SIZE)) +                        padblocks = (SHM_BUFFER_SIZE) - *rdrb->head; +#endif          }          if (ret != ETIMEDOUT) { @@ -547,21 +504,14 @@ int shm_rdrbuff_remove(struct shm_rdrbuff * rdrb,          pthread_mutex_lock(rdrb->lock);  #else          if (pthread_mutex_lock(rdrb->lock) == EOWNERDEAD) -                pthread_mutex_consistent(rdrb->lock); +                sanitize(rdrb);  #endif -        if (shm_rdrb_empty(rdrb)) { -                pthread_mutex_unlock(rdrb->lock); -                return -1; -        } +        assert(!shm_rdrb_empty(rdrb));          idx_to_du_buff_ptr(rdrb, idx)->flags = SDB_NULL; -        if (idx != *rdrb->tail) { -                pthread_mutex_unlock(rdrb->lock); -                return 0; -        } - -        garbage_collect(rdrb); +        if (idx == *rdrb->tail) +                garbage_collect(rdrb);          pthread_mutex_unlock(rdrb->lock); | 
