diff options
author | Sander Vrijders <[email protected]> | 2016-07-28 11:54:26 +0200 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2016-07-28 11:54:26 +0200 |
commit | e31d8dc166365cb501e86e832293b550bb277385 (patch) | |
tree | 251def449799fd5cce0f2c02883bcdab2a5dff7e /src/irmd/main.c | |
parent | 0bce1fb10d7dbed4beebcdb8a083c5019be5907e (diff) | |
parent | 67de2ae5f7aee25c077096bd90a8d4cd3cdcf094 (diff) | |
download | ouroboros-e31d8dc166365cb501e86e832293b550bb277385.tar.gz ouroboros-e31d8dc166365cb501e86e832293b550bb277385.zip |
Merge remote-tracking branch 'upstream/be' into be-enrolment
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r-- | src/irmd/main.c | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c index 6cf16505..b071ff1c 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -998,17 +998,13 @@ static int flow_alloc_res(int port_id) return 0; } - if (e->state == FLOW_DESTROY) { - /* don't release the port_id, AP has to call dealloc */ - e->state = FLOW_NULL; - pthread_cond_signal(&e->state_cond); - pthread_mutex_unlock(&e->state_lock); - pthread_rwlock_unlock(&irmd->flows_lock); - pthread_rwlock_unlock(&irmd->state_lock); - return -1; - } + e->state = FLOW_NULL; + pthread_cond_signal(&e->state_cond); + pthread_mutex_unlock(&e->state_lock); + pthread_rwlock_unlock(&irmd->flows_lock); + pthread_rwlock_unlock(&irmd->state_lock); - return 0; + return -1; } static int flow_dealloc(int port_id) @@ -1083,7 +1079,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 +1158,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 +1203,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; } |