diff options
author | Sander Vrijders <[email protected]> | 2016-06-29 15:47:50 +0200 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2016-06-29 15:47:50 +0200 |
commit | 278abed7b636f3368dcfd3b54200d31517e7142b (patch) | |
tree | 38359556d0bf0a82bcc27ed2c53c64c29ea3a7d2 | |
parent | a19521aa74edfa4a2eb62466b04c9264c3b6576c (diff) | |
parent | 205690cb7ceb14de5f4478df721a6c1060536924 (diff) | |
download | ouroboros-278abed7b636f3368dcfd3b54200d31517e7142b.tar.gz ouroboros-278abed7b636f3368dcfd3b54200d31517e7142b.zip |
Merged in dstaesse/ouroboros/be-irmd-auto (pull request #145)
irmd: fix lockup and cond_signal skip
-rw-r--r-- | src/irmd/main.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c index f6c27377..5ff84da1 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -709,7 +709,7 @@ static int registry_add_ap_auto(char * name, a->ap_name = ap_name; a->argv = argv; - if(e->state == REG_NAME_IDLE) + if (e->state == REG_NAME_IDLE) e->state = REG_NAME_AUTO_ACCEPT; list_add(&a->next, &e->auto_ap_info); @@ -741,7 +741,7 @@ static int registry_remove_ap_auto(char * name, list_del(&a->next); - if(e->state == REG_NAME_AUTO_ACCEPT && list_empty(&e->auto_ap_info)) + if (e->state == REG_NAME_AUTO_ACCEPT && list_empty(&e->auto_ap_info)) e->state = REG_NAME_IDLE; return 0; @@ -784,7 +784,8 @@ static struct reg_instance * registry_add_ap_instance(char * name, return NULL; } - if(e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT) { + if (e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT + || e->state == REG_NAME_AUTO_EXEC) { e->state = REG_NAME_FLOW_ACCEPT; pthread_cond_signal(&e->acc_signal); } @@ -1640,6 +1641,7 @@ static struct port_map_entry * flow_req_arr(pid_t api, struct port_map_entry * pme = NULL; bool acc_wait = true; + enum reg_name_state state; pme = port_map_entry_create(); if (pme == NULL) { @@ -1665,16 +1667,18 @@ static struct port_map_entry * flow_req_arr(pid_t api, } pthread_mutex_lock(&rne->state_lock); + state = rne->state; + pthread_mutex_unlock(&rne->state_lock); - switch (rne->state) { + switch (state) { case REG_NAME_IDLE: - pthread_mutex_unlock(&rne->state_lock); pthread_rwlock_unlock(&instance->reg_lock); pthread_rwlock_unlock(&instance->state_lock); LOG_ERR("No AP's for %s.", dst_name); free(pme); return NULL; case REG_NAME_AUTO_ACCEPT: + pthread_mutex_lock(&rne->state_lock); rne->state = REG_NAME_AUTO_EXEC; pthread_mutex_unlock(&rne->state_lock); @@ -1685,6 +1689,8 @@ static struct port_map_entry * flow_req_arr(pid_t api, return NULL; } + pthread_rwlock_unlock(&instance->reg_lock); + pthread_mutex_lock(&rne->state_lock); pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, (void *) &rne->state_lock); @@ -1693,13 +1699,13 @@ static struct port_map_entry * flow_req_arr(pid_t api, pthread_cond_wait(&rne->acc_signal, &rne->state_lock); - pthread_cleanup_pop(false); + pthread_cleanup_pop(true); - case REG_NAME_FLOW_ACCEPT: - pthread_mutex_unlock(&rne->state_lock); + pthread_rwlock_rdlock(&instance->reg_lock); + case REG_NAME_FLOW_ACCEPT: pme->n_api = registry_resolve_api(rne); - if(pme->n_api == 0) { + if (pme->n_api == 0) { pthread_rwlock_unlock(&instance->reg_lock); pthread_rwlock_unlock(&instance->state_lock); LOG_ERR("Invalid api returned."); @@ -1708,7 +1714,6 @@ static struct port_map_entry * flow_req_arr(pid_t api, break; default: - pthread_mutex_unlock(&rne->state_lock); pthread_rwlock_unlock(&instance->reg_lock); pthread_rwlock_unlock(&instance->state_lock); LOG_ERR("IRMd in wrong state."); @@ -1717,6 +1722,7 @@ static struct port_map_entry * flow_req_arr(pid_t api, } pthread_rwlock_unlock(&instance->reg_lock); + pthread_rwlock_wrlock(&instance->flows_lock); pme->port_id = bmp_allocate(instance->port_ids); @@ -1904,7 +1910,7 @@ void * irm_flow_cleaner() IRMD_CLEANUP_TIMER % BILLION}; while (true) { - if(clock_gettime(CLOCK_MONOTONIC, &now) < 0) + if (clock_gettime(CLOCK_MONOTONIC, &now) < 0) LOG_WARN("Failed to get time."); /* cleanup stale PENDING flows */ @@ -2305,7 +2311,7 @@ int main() pthread_create(&instance->cleanup_flows, NULL, irm_flow_cleaner, NULL); pthread_create(&instance->shm_sanitize, NULL, - shm_du_map_sanitize, NULL); + shm_du_map_sanitize, instance->dum); /* wait for (all of them) to return */ for (t = 0; t < IRMD_THREADPOOL_SIZE; ++t) |