diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-07-27 20:00:13 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-07-27 20:00:13 +0200 |
commit | 351a48acbe1295e7a446951b7ae7c461d42b8bbb (patch) | |
tree | 0229b141341e9c64c91e850469ae31d819f0fdba /src/irmd/registry.c | |
parent | 6c54691d1931118155360ac010671ff554cd4f71 (diff) | |
parent | 7c18c1c74ac4771ffe9b0533b5bdd447c29e9802 (diff) | |
download | ouroboros-351a48acbe1295e7a446951b7ae7c461d42b8bbb.tar.gz ouroboros-351a48acbe1295e7a446951b7ae7c461d42b8bbb.zip |
Merged in dstaesse/ouroboros/be-irmd (pull request #178)
irmd: Fix shutdown
Diffstat (limited to 'src/irmd/registry.c')
-rw-r--r-- | src/irmd/registry.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/src/irmd/registry.c b/src/irmd/registry.c index ab47fede..a1d1238d 100644 --- a/src/irmd/registry.c +++ b/src/irmd/registry.c @@ -114,6 +114,13 @@ static void reg_api_destroy(struct reg_api * i) free(i); } +static void cleanup_sleeper(void * o) { + struct reg_api * i = (struct reg_api *) o; + i->state = REG_I_NULL; + pthread_cond_signal(&i->state_cond); + pthread_mutex_unlock(&i->state_lock); +} + void reg_api_sleep(struct reg_api * i) { if (i == NULL) @@ -127,15 +134,11 @@ void reg_api_sleep(struct reg_api * i) i->state = REG_I_SLEEP; - pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, - (void *) &i->state_lock); + pthread_cleanup_push(cleanup_sleeper, (void *) i); while (i->state == REG_I_SLEEP) pthread_cond_wait(&i->state_cond, &i->state_lock); - i->state = REG_I_NULL; - pthread_cond_signal(&i->state_cond); - pthread_cleanup_pop(true); } @@ -235,8 +238,6 @@ static void reg_entry_destroy(struct reg_entry * e) struct list_head * pos = NULL; struct list_head * n = NULL; - bool wait = true; - if (e == NULL) return; @@ -247,12 +248,6 @@ static void reg_entry_destroy(struct reg_entry * e) pthread_cond_broadcast(&e->state_cond); pthread_mutex_unlock(&e->state_lock); - while (wait) { - pthread_mutex_lock(&e->state_lock); - pthread_cond_broadcast(&e->state_cond); - pthread_mutex_unlock(&e->state_lock); - } - pthread_mutex_destroy(&e->state_lock); if (e->name != NULL) |