diff options
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r-- | src/irmd/main.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c index 27f57077..d0ba969f 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1379,6 +1379,8 @@ void * irm_flow_cleaner() struct timespec now; struct list_head * pos = NULL; struct list_head * n = NULL; + struct list_head * h = NULL; + struct list_head * t = NULL; struct timespec timeout = {IRMD_CLEANUP_TIMER / BILLION, IRMD_CLEANUP_TIMER % BILLION}; @@ -1444,10 +1446,10 @@ void * irm_flow_cleaner() pthread_rwlock_unlock(&irmd->flows_lock); - registry_sanitize_apis(&irmd->registry); - pthread_rwlock_wrlock(&irmd->reg_lock); + registry_sanitize_apis(&irmd->registry); + list_for_each_safe(pos, n, &irmd->spawned_apis) { struct spawned_api * api = list_entry(pos, struct spawned_api, next); @@ -1457,6 +1459,17 @@ void * irm_flow_cleaner() LOG_INFO("Spawned process %d terminated " "with exit status %d.", api->api, status); + + list_for_each_safe(h, t, &irmd->ipcps) { + struct ipcp_entry * e = + list_entry(h, struct ipcp_entry, + next); + if (e->api == api->api) { + list_del(&e->next); + ipcp_entry_destroy(e); + } + } + list_del(&api->next); free(api); } |