summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/connmgr.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@ugent.be>2017-03-20 13:41:32 +0000
committerSander Vrijders <sander.vrijders@ugent.be>2017-03-20 13:41:32 +0000
commit3bb7ed41f8c96a15f16281f3c9f282e6690aed38 (patch)
tree47253bfd01c7c42677d292cc7d817d830f0a430c /src/ipcpd/normal/connmgr.c
parent62e725ced1395b161b0fd66aea433c709850cc57 (diff)
parentd14259796288f9d3eae907408b3c9c2e8c750a9c (diff)
downloadouroboros-3bb7ed41f8c96a15f16281f3c9f282e6690aed38.tar.gz
ouroboros-3bb7ed41f8c96a15f16281f3c9f282e6690aed38.zip
Merged in dstaesse/ouroboros/be-connmgr (pull request #403)
ipcpd: Fix cleanup of connmgr
Diffstat (limited to 'src/ipcpd/normal/connmgr.c')
-rw-r--r--src/ipcpd/normal/connmgr.c43
1 files changed, 25 insertions, 18 deletions
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,