From 6d6e1e2beec5bc003e490b8f96d861e6e8f7295d Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Mon, 20 Mar 2017 13:37:16 +0100 Subject: ipcpd: Fix cleanup of connmgr Fixed trying to double lock and cleanup order in main. --- src/ipcpd/normal/connmgr.c | 43 +++++++++++++++++++++++++------------------ src/ipcpd/normal/main.c | 4 ++-- 2 files changed, 27 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/connmgr.c b/src/ipcpd/normal/connmgr.c index c86beae8..b97d2b23 100644 --- a/src/ipcpd/normal/connmgr.c +++ b/src/ipcpd/normal/connmgr.c @@ -192,6 +192,27 @@ void connmgr_stop(void) pthread_join(connmgr.acceptor, NULL); } +static void destroy_ae(struct ae * ae) +{ + struct list_head * p = NULL; + struct list_head * h = NULL; + + pthread_mutex_lock(&ae->conn_lock); + + list_for_each_safe(p, h, &ae->conn_list) { + struct ae_conn * e = list_entry(p, struct ae_conn, next); + list_del(&e->next); + free(e); + } + + pthread_mutex_unlock(&ae->conn_lock); + + pthread_cond_destroy(&ae->conn_cond); + pthread_mutex_destroy(&ae->conn_lock); + + free(ae); +} + void connmgr_fini(void) { struct list_head * p = NULL; @@ -201,7 +222,8 @@ void connmgr_fini(void) list_for_each_safe(p, n, &connmgr.aes) { struct ae * e = list_entry(p, struct ae, next); - connmgr_ae_destroy(e); + list_del(&e->next); + destroy_ae(e); } pthread_mutex_unlock(&connmgr.aes_lock); @@ -242,30 +264,15 @@ struct ae * connmgr_ae_create(struct conn_info info) void connmgr_ae_destroy(struct ae * ae) { - struct list_head * p = NULL; - struct list_head * n = NULL; - assert(ae); pthread_mutex_lock(&connmgr.aes_lock); - pthread_mutex_lock(&ae->conn_lock); - - list_for_each_safe(p, n, &ae->conn_list) { - struct ae_conn * e = list_entry(p, struct ae_conn, next); - list_del(&e->next); - free(e); - } - - pthread_mutex_unlock(&ae->conn_lock); - - pthread_cond_destroy(&ae->conn_cond); - pthread_mutex_destroy(&ae->conn_lock); list_del(&ae->next); - pthread_mutex_unlock(&connmgr.aes_lock); + destroy_ae(ae); - free(ae); + pthread_mutex_unlock(&connmgr.aes_lock); } int connmgr_alloc(struct ae * ae, diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index 814a0c0b..398d6ee3 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -472,10 +472,10 @@ int main(int argc, rib_fini(); - connmgr_fini(); - enroll_fini(); + connmgr_fini(); + irm_unbind_api(getpid(), ipcpi.name); ipcp_fini(); -- cgit v1.2.3 From d14259796288f9d3eae907408b3c9c2e8c750a9c Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Mon, 20 Mar 2017 14:31:08 +0100 Subject: ipcpd: Create CDAP instance before connecting This lessens the likelyhood that the CDAP SDU thread is not yet active when a new connection starts sending CDAP messages. --- src/ipcpd/normal/enroll.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/enroll.c b/src/ipcpd/normal/enroll.c index bdf55fe8..7e15be11 100644 --- a/src/ipcpd/normal/enroll.c +++ b/src/ipcpd/normal/enroll.c @@ -73,15 +73,15 @@ static void * enroll_handle(void * o) (void) o; while (true) { - if (connmgr_wait(enroll.ae, &conn)) { - log_err("Failed to get next connection."); - continue; - } - cdap = cdap_create(); if (cdap == NULL) { log_err("Failed to instantiate CDAP."); - flow_dealloc(conn.flow_info.fd); + continue; + } + + if (connmgr_wait(enroll.ae, &conn)) { + log_err("Failed to get next connection."); + cdap_destroy(cdap); continue; } @@ -179,17 +179,18 @@ int enroll_boot(char * dst_name) char * members_ro = MEMBERS_PATH; char * dif_ro = DIF_PATH; - if (connmgr_alloc(enroll.ae, dst_name, NULL, &conn)) { - log_err("Failed to get connection."); - return -1; - } - cdap = cdap_create(); if (cdap == NULL) { log_err("Failed to instantiate CDAP."); return -1; } + if (connmgr_alloc(enroll.ae, dst_name, NULL, &conn)) { + log_err("Failed to get connection."); + cdap_destroy(cdap); + return -1; + } + if (cdap_add_flow(cdap, conn.flow_info.fd)) { log_warn("Failed to add flow to CDAP."); cdap_destroy(cdap); -- cgit v1.2.3