diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ipcpd/normal/connmgr.c | 6 | ||||
-rw-r--r-- | src/ipcpd/normal/enroll.c | 32 |
2 files changed, 22 insertions, 16 deletions
diff --git a/src/ipcpd/normal/connmgr.c b/src/ipcpd/normal/connmgr.c index b97d2b23..b8314917 100644 --- a/src/ipcpd/normal/connmgr.c +++ b/src/ipcpd/normal/connmgr.c @@ -328,7 +328,7 @@ int connmgr_alloc(struct ae * ae, int connmgr_wait(struct ae * ae, struct conn * conn) { - struct ae_conn * ae_conn; + struct ae_conn * ae_conn = NULL; assert(ae); assert(conn); @@ -341,6 +341,8 @@ int connmgr_wait(struct ae * ae, while (list_is_empty(&ae->conn_list)) pthread_cond_wait(&ae->conn_cond, &ae->conn_lock); + pthread_cleanup_pop(false); + ae_conn = list_first_entry((&ae->conn_list), struct ae_conn, next); if (ae_conn == NULL) { pthread_mutex_unlock(&ae->conn_lock); @@ -352,7 +354,7 @@ int connmgr_wait(struct ae * ae, list_del(&ae_conn->next); free(ae_conn); - pthread_cleanup_pop(true); + pthread_mutex_unlock(&ae->conn_lock); return 0; } diff --git a/src/ipcpd/normal/enroll.c b/src/ipcpd/normal/enroll.c index 7e15be11..0b0db1cf 100644 --- a/src/ipcpd/normal/enroll.c +++ b/src/ipcpd/normal/enroll.c @@ -46,8 +46,9 @@ #define ENROLL_WARN_TIME_OFFSET 20 struct { - struct ae * ae; - pthread_t listener; + struct ae * ae; + struct cdap * cdap; + pthread_t listener; } enroll; static void * enroll_handle(void * o) @@ -70,24 +71,18 @@ static void * enroll_handle(void * o) char * members_ro = MEMBERS_PATH; char * dif_ro = DIF_PATH; - (void) o; + cdap = (struct cdap *) o; - while (true) { - cdap = cdap_create(); - if (cdap == NULL) { - log_err("Failed to instantiate CDAP."); - continue; - } + assert(cdap); + while (true) { if (connmgr_wait(enroll.ae, &conn)) { log_err("Failed to get next connection."); - cdap_destroy(cdap); continue; } if (cdap_add_flow(cdap, conn.flow_info.fd)) { log_warn("Failed to add flow to CDAP."); - cdap_destroy(cdap); flow_dealloc(conn.flow_info.fd); continue; } @@ -155,7 +150,7 @@ static void * enroll_handle(void * o) log_dbg("Sent boot info to new member."); - cdap_destroy(cdap); + cdap_del_flow(cdap, conn.flow_info.fd); flow_dealloc(conn.flow_info.fd); } @@ -337,6 +332,12 @@ int enroll_init(void) { struct conn_info info; + enroll.cdap = cdap_create(); + if (enroll.cdap == NULL) { + log_err("Failed to instantiate CDAP."); + return -1; + } + memset(&info, 0, sizeof(info)); strcpy(info.ae_name, ENROLL_AE); @@ -345,20 +346,23 @@ int enroll_init(void) info.pref_syntax = PROTO_GPB; enroll.ae = connmgr_ae_create(info); - if (enroll.ae == NULL) + if (enroll.ae == NULL) { + cdap_destroy(enroll.cdap); return -1; + } return 0; } void enroll_fini(void) { + cdap_destroy(enroll.cdap); connmgr_ae_destroy(enroll.ae); } int enroll_start(void) { - if (pthread_create(&enroll.listener, NULL, enroll_handle, NULL)) + if (pthread_create(&enroll.listener, NULL, enroll_handle, enroll.cdap)) return -1; return 0; |