summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/normal/connmgr.c6
-rw-r--r--src/ipcpd/normal/enroll.c32
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;