diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/tpm.c | 32 | 
1 files changed, 23 insertions, 9 deletions
| diff --git a/src/lib/tpm.c b/src/lib/tpm.c index ca2eb1ef..0ba9619b 100644 --- a/src/lib/tpm.c +++ b/src/lib/tpm.c @@ -82,11 +82,19 @@ static void tpm_join(struct tpm * tpm)                                  --tpm->cur;                          }                  } +        } +        list_for_each_safe(p, h, &tpm->pool) { +                struct pthr_el * e = list_entry(p, struct pthr_el, next);                  if (e->kill) { -                        pthread_join(e->thr, NULL); +                        pthread_t thr = e->thr;                          list_del(&e->next);                          free(e); +                        pthread_mutex_unlock(&tpm->lock); + +                        pthread_join(thr, NULL); + +                        pthread_mutex_lock(&tpm->lock);                  }          }  } @@ -256,29 +264,35 @@ static struct pthr_el * tpm_pthr_el(struct tpm * tpm,          } -        assert(false); -          return NULL;  }  void tpm_inc(struct tpm * tpm)  { -        pthread_mutex_lock(&tpm->lock); +        struct pthr_el * e; -        tpm_pthr_el(tpm, pthread_self())->busy = false; +        pthread_mutex_lock(&tpm->lock); -        --tpm->wrk; +        e = tpm_pthr_el(tpm, pthread_self()); +        if (e != NULL) { +                e->busy = false; +                --tpm->wrk; +        }          pthread_mutex_unlock(&tpm->lock);  }  void tpm_dec(struct tpm * tpm)  { -        pthread_mutex_lock(&tpm->lock); +        struct pthr_el * e; -        tpm_pthr_el(tpm, pthread_self())->busy = true; +        pthread_mutex_lock(&tpm->lock); -        ++tpm->wrk; +        e = tpm_pthr_el(tpm, pthread_self()); +        if (e != NULL) { +                e->busy = true; +                ++tpm->wrk; +        }          pthread_cond_signal(&tpm->cond); | 
