summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2016-07-27 20:00:13 +0200
committerSander Vrijders <sander.vrijders@intec.ugent.be>2016-07-27 20:00:13 +0200
commit351a48acbe1295e7a446951b7ae7c461d42b8bbb (patch)
tree0229b141341e9c64c91e850469ae31d819f0fdba /src/irmd/main.c
parent6c54691d1931118155360ac010671ff554cd4f71 (diff)
parent7c18c1c74ac4771ffe9b0533b5bdd447c29e9802 (diff)
downloadouroboros-351a48acbe1295e7a446951b7ae7c461d42b8bbb.tar.gz
ouroboros-351a48acbe1295e7a446951b7ae7c461d42b8bbb.zip
Merged in dstaesse/ouroboros/be-irmd (pull request #178)
irmd: Fix shutdown
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 6cf16505..d7119bac 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1083,7 +1083,6 @@ static struct irm_flow * flow_req_arr(pid_t api,
struct reg_entry * rne = NULL;
struct irm_flow * pme = NULL;
- bool acc_wait = true;
enum reg_name_state state;
struct spawned_api * c_api;
@@ -1163,6 +1162,7 @@ static struct irm_flow * flow_req_arr(pid_t api,
pthread_rwlock_rdlock(&irmd->reg_lock);
pthread_mutex_lock(&rne->state_lock);
if (rne->state == REG_NAME_DESTROY) {
+ rne->state = REG_NAME_NULL;
pthread_mutex_unlock(&rne->state_lock);
pthread_rwlock_unlock(&irmd->reg_lock);
return NULL;
@@ -1207,14 +1207,14 @@ static struct irm_flow * flow_req_arr(pid_t api,
pthread_rwlock_unlock(&irmd->state_lock);
- while (acc_wait) {
- pthread_rwlock_rdlock(&irmd->state_lock);
- pthread_mutex_lock(&rne->state_lock);
- acc_wait = (rne->state == REG_NAME_FLOW_ARRIVED &&
- irmd->state == IRMD_RUNNING);
- pthread_mutex_unlock(&rne->state_lock);
- pthread_rwlock_unlock(&irmd->state_lock);
- }
+ pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock,
+ (void *) &rne->state_lock);
+
+ while (rne->state == REG_NAME_FLOW_ARRIVED &&
+ irmd->state == IRMD_RUNNING)
+ pthread_cond_wait(&rne->state_cond, &rne->state_lock);
+
+ pthread_cleanup_pop(true);
return pme;
}