From db1fb77187fd9170c9a0a8089225b214053f3034 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 26 Aug 2016 16:40:50 +0200 Subject: irmd: Revise shutdown procedure Flows are deallocated first, then the socket is closed to prevent IPCPs hanging on the connect. --- src/irmd/main.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/irmd/main.c b/src/irmd/main.c index 5f793afd..cd939360 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1548,6 +1548,20 @@ static void irm_destroy() if (irmd->threadpool != NULL) free(irmd->threadpool); + 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); + ipcp_flow_dealloc(f->n_1_api, f->port_id); + irm_flow_destroy(f); + } + + close(irmd->sockfd); + + if (unlink(IRM_SOCK_PATH)) + LOG_DBG("Failed to unlink %s.", IRM_SOCK_PATH); + pthread_rwlock_wrlock(&irmd->reg_lock); /* clear the lists */ list_for_each_safe(p, h, &irmd->ipcps) { @@ -1585,14 +1599,6 @@ static void irm_destroy() pthread_rwlock_unlock(&irmd->reg_lock); - 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_destroy(f); - } - if (irmd->port_ids != NULL) bmp_destroy(irmd->port_ids); @@ -1604,11 +1610,6 @@ static void irm_destroy() if (irmd->lf != NULL) lockfile_destroy(irmd->lf); - close(irmd->sockfd); - - if (unlink(IRM_SOCK_PATH)) - LOG_DBG("Failed to unlink %s.", IRM_SOCK_PATH); - pthread_rwlock_unlock(&irmd->state_lock); pthread_rwlock_destroy(&irmd->reg_lock); -- cgit v1.2.3 From 7fd43a33c5964fcf0f8de2efc9dbf27f8db25fc4 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 26 Aug 2016 16:44:17 +0200 Subject: ipcpd: Report pid on shutdown IPCPs will report their pid on shutdown for faster debugging. --- src/ipcpd/local/main.c | 4 ++-- src/ipcpd/normal/main.c | 4 ++-- src/ipcpd/shim-eth-llc/main.c | 4 ++-- src/ipcpd/shim-udp/main.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index 6993cea2..547e7e28 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -228,8 +228,8 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c) case SIGHUP: case SIGQUIT: if (info->si_pid == irmd_api) { - LOG_DBG("Terminating by order of %d. Bye.", - info->si_pid); + LOG_DBG("IPCP %d terminating by order of %d. Bye.", + getpid(), info->si_pid); pthread_rwlock_wrlock(&_ipcp->state_lock); diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index f0fc0681..335330ae 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -72,8 +72,8 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c) case SIGTERM: case SIGHUP: if (info->si_pid == irmd_api) { - LOG_DBG("Terminating by order of %d. Bye.", - info->si_pid); + LOG_DBG("IPCP %d terminating by order of %d. Bye.", + getpid(), info->si_pid); pthread_rwlock_wrlock(&_ipcp->state_lock); diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 60b55009..608b0029 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -830,8 +830,8 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c) case SIGTERM: case SIGHUP: if (info->si_pid == irmd_api) { - LOG_DBG("Terminating by order of %d. Bye.", - info->si_pid); + LOG_DBG("IPCP %d terminating by order of %d. Bye.", + getpid(), info->si_pid); pthread_rwlock_wrlock(&_ipcp->state_lock); diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index 292d347d..3f9b20f1 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -793,8 +793,8 @@ void ipcp_sig_handler(int sig, siginfo_t * info, void * c) case SIGTERM: case SIGHUP: if (info->si_pid == irmd_api) { - LOG_DBG("Terminating by order of %d. Bye.", - info->si_pid); + LOG_DBG("IPCP %d terminating by order of %d. Bye.", + getpid(), info->si_pid); pthread_rwlock_wrlock(&_ipcp->state_lock); -- cgit v1.2.3