summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@ugent.be>2017-03-29 16:34:06 +0000
committerSander Vrijders <sander.vrijders@ugent.be>2017-03-29 16:34:06 +0000
commit6d331deca437e157cc9aa23a1fd5d0d4c2353cb8 (patch)
tree5fcbd918d35fdfb741fb215d23ee35ebc38a69fa
parent489b6be608ce40d5249d95f77815be9b422995d5 (diff)
parent001b2bd5b79b2e6af7942d83689163e2120ff1de (diff)
downloadouroboros-6d331deca437e157cc9aa23a1fd5d0d4c2353cb8.tar.gz
ouroboros-6d331deca437e157cc9aa23a1fd5d0d4c2353cb8.zip
Merged in dstaesse/ouroboros/be-fix-irmd-shutdown (pull request #433)
irmd: Exit blocking threads from irm_sanitizer
-rw-r--r--src/irmd/main.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index afd60f4d..9901a608 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1536,12 +1536,10 @@ static void irm_destroy(void)
pthread_rwlock_wrlock(&irmd->flows_lock);
- list_for_each_safe(p, h, &irmd->irm_flows) {
- struct irm_flow * f = list_entry(p, struct irm_flow, next);
- list_del(&f->next);
- clear_irm_flow(f);
- irm_flow_destroy(f);
- }
+ if (irmd->port_ids != NULL)
+ bmp_destroy(irmd->port_ids);
+
+ pthread_rwlock_unlock(&irmd->flows_lock);
close(irmd->sockfd);
@@ -1559,13 +1557,6 @@ static void irm_destroy(void)
ipcp_entry_destroy(e);
}
- list_for_each_safe(p, h, &irmd->api_table) {
- struct api_entry * e = list_entry(p, struct api_entry, next);
- list_del(&e->next);
- registry_del_api(&irmd->registry, e->api);
- api_entry_destroy(e);
- }
-
list_for_each_safe(p, h, &irmd->spawned_apis) {
struct pid_el * e = list_entry(p, struct pid_el, next);
int status;
@@ -1588,11 +1579,6 @@ static void irm_destroy(void)
pthread_rwlock_unlock(&irmd->reg_lock);
- if (irmd->port_ids != NULL)
- bmp_destroy(irmd->port_ids);
-
- pthread_rwlock_unlock(&irmd->flows_lock);
-
if (irmd->rdrb != NULL)
shm_rdrbuff_destroy(irmd->rdrb);
@@ -1688,11 +1674,30 @@ void * irm_sanitize(void * o)
while (true) {
if (clock_gettime(CLOCK_MONOTONIC, &now) < 0)
log_warn("Failed to get time.");
- /* Cleanup stale PENDING flows. */
pthread_rwlock_rdlock(&irmd->state_lock);
if (irmd->state != IRMD_RUNNING) {
+ /* Clean up all flows first to kill mainloops */
+ pthread_rwlock_wrlock(&irmd->flows_lock);
+ list_for_each_safe(p, h, &irmd->irm_flows) {
+ struct irm_flow * f =
+ list_entry(p, struct irm_flow, next);
+ list_del(&f->next);
+ irm_flow_set_state(f, FLOW_NULL);
+ clear_irm_flow(f);
+ irm_flow_destroy(f);
+ }
+ pthread_rwlock_unlock(&irmd->flows_lock);
+ pthread_rwlock_wrlock(&irmd->reg_lock);
+ /* Clean up api entries as well */
+ list_for_each_safe(p, h, &irmd->api_table) {
+ struct api_entry * e =
+ list_entry(p, struct api_entry, next);
+ list_del(&e->next);
+ api_entry_destroy(e);
+ }
+ pthread_rwlock_unlock(&irmd->reg_lock);
pthread_rwlock_unlock(&irmd->state_lock);
return (void *) 0;
}
@@ -2198,8 +2203,7 @@ int main(int argc,
pthread_create(&irmd->threadpool[t], NULL, mainloop, NULL);
pthread_create(&irmd->irm_sanitize, NULL, irm_sanitize, NULL);
- pthread_create(&irmd->shm_sanitize, NULL,
- shm_sanitize, irmd->rdrb);
+ pthread_create(&irmd->shm_sanitize, NULL, shm_sanitize, irmd->rdrb);
/* Wait for (all of them) to return. */
for (t = 0; t < IRMD_THREADPOOL_SIZE; ++t)