From 9dce327e10bffddc9dc5058f06407e8ff12389b7 Mon Sep 17 00:00:00 2001
From: dimitri staessens <dimitri.staessens@intec.ugent.be>
Date: Tue, 9 Aug 2016 16:06:12 +0200
Subject: lib: Various fixes

Fix missing set of api upon flow_alloc.
Various locking fixes.
---
 include/ouroboros/shm_ap_rbuff.h |  1 -
 src/irmd/main.c                  | 16 +++++++++++++---
 src/irmd/reg_api.c               |  5 ++++-
 src/irmd/registry.c              |  4 ++++
 src/lib/dev.c                    |  4 ++--
 src/lib/shm_ap_rbuff.c           | 13 -------------
 src/lib/shm_du_map.c             | 10 +++-------
 7 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/include/ouroboros/shm_ap_rbuff.h b/include/ouroboros/shm_ap_rbuff.h
index 50b077f0..a1949122 100644
--- a/include/ouroboros/shm_ap_rbuff.h
+++ b/include/ouroboros/shm_ap_rbuff.h
@@ -49,6 +49,5 @@ ssize_t               shm_ap_rbuff_read_port(struct shm_ap_rbuff * rb,
 ssize_t               shm_ap_rbuff_read_port_b(struct shm_ap_rbuff * rb,
                                                int port_id,
                                                const struct timespec * timeout);
-pid_t                 shm_ap_rbuff_get_api(struct shm_ap_rbuff * rb);
 void                  shm_ap_rbuff_reset(struct shm_ap_rbuff * rb);
 #endif /* OUROBOROS_SHM_AP_RBUFF_H */
diff --git a/src/irmd/main.c b/src/irmd/main.c
index a79330ef..c7c1566d 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -524,6 +524,9 @@ static ssize_t list_ipcps(char * name,
         ssize_t count = 0;
         int i = 0;
 
+        pthread_rwlock_rdlock(&irmd->state_lock);
+        pthread_rwlock_rdlock(&irmd->reg_lock);
+
         list_for_each(pos, &irmd->ipcps) {
                 struct ipcp_entry * tmp =
                         list_entry(pos, struct ipcp_entry, next);
@@ -535,6 +538,8 @@ static ssize_t list_ipcps(char * name,
 
         *apis = malloc(count * sizeof(pid_t));
         if (*apis == NULL) {
+                pthread_rwlock_unlock(&irmd->reg_lock);
+                pthread_rwlock_unlock(&irmd->state_lock);
                 return -1;
         }
 
@@ -547,6 +552,9 @@ static ssize_t list_ipcps(char * name,
                 }
         }
 
+        pthread_rwlock_unlock(&irmd->reg_lock);
+        pthread_rwlock_unlock(&irmd->state_lock);
+
         return count;
 }
 
@@ -884,6 +892,7 @@ static void cleanup_alloc_res(void * o)
         struct irm_flow * f = (struct irm_flow *) o;
         if (f->state == FLOW_PENDING)
                 f->state = FLOW_NULL;
+        pthread_cond_broadcast(&f->state_cond);
         pthread_mutex_unlock(&f->state_lock);
 }
 
@@ -936,6 +945,7 @@ static int flow_alloc_res(int port_id)
         pthread_mutex_lock(&f->state_lock);
 
         if (f->state == FLOW_ALLOCATED) {
+                pthread_cond_broadcast(&f->state_cond);
                 pthread_mutex_unlock(&f->state_lock);
                 pthread_rwlock_unlock(&irmd->flows_lock);
                 pthread_rwlock_unlock(&irmd->state_lock);
@@ -943,7 +953,7 @@ static int flow_alloc_res(int port_id)
         }
 
         f->state = FLOW_NULL;
-        pthread_cond_signal(&f->state_cond);
+        pthread_cond_broadcast(&f->state_cond);
         pthread_mutex_unlock(&f->state_lock);
         pthread_rwlock_unlock(&irmd->flows_lock);
         pthread_rwlock_unlock(&irmd->state_lock);
@@ -1040,7 +1050,7 @@ static struct irm_flow * flow_req_arr(pid_t  api,
                 LOG_WARN("Failed to set timestamp.");
 
         pthread_rwlock_rdlock(&irmd->state_lock);
-        pthread_rwlock_rdlock(&irmd->reg_lock);
+        pthread_rwlock_wrlock(&irmd->reg_lock);
 
         rne = registry_get_entry_by_name(&irmd->registry, dst_name);
         if (rne == NULL) {
@@ -1172,7 +1182,7 @@ static int flow_alloc_reply(int port_id,
         struct irm_flow * f;
 
         pthread_rwlock_rdlock(&irmd->state_lock);
-        pthread_rwlock_rdlock(&irmd->flows_lock);
+        pthread_rwlock_wrlock(&irmd->flows_lock);
 
         f = get_irm_flow(port_id);
         if (f == NULL) {
diff --git a/src/irmd/reg_api.c b/src/irmd/reg_api.c
index d50f89e8..648dc1b3 100644
--- a/src/irmd/reg_api.c
+++ b/src/irmd/reg_api.c
@@ -111,8 +111,11 @@ void reg_api_wake(struct reg_api * i)
 
         pthread_cond_broadcast(&i->state_cond);
 
+        pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock,
+                             (void *) &i->state_lock);
+
         while (i->state == REG_I_WAKE)
                 pthread_cond_wait(&i->state_cond, &i->state_lock);
 
-        pthread_mutex_unlock(&i->state_lock);
+        pthread_cleanup_pop(true);
 }
diff --git a/src/irmd/registry.c b/src/irmd/registry.c
index ec1c3987..ae8c3b0a 100644
--- a/src/irmd/registry.c
+++ b/src/irmd/registry.c
@@ -503,6 +503,8 @@ struct reg_api * registry_add_api_name(struct list_head * registry,
                 return NULL;
         }
 
+        pthread_mutex_lock(&e->state_lock);
+
         if (e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT
            || e->state == REG_NAME_AUTO_EXEC) {
                 e->state = REG_NAME_FLOW_ACCEPT;
@@ -511,6 +513,8 @@ struct reg_api * registry_add_api_name(struct list_head * registry,
 
         list_add(&i->next, &e->reg_apis);
 
+        pthread_mutex_unlock(&e->state_lock);
+
         return i;
 }
 
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 6f0de8c8..3c31ce6d 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -203,6 +203,7 @@ int flow_accept(char ** ae_name)
 
         _ap_instance->flows[cfd].port_id = recv_msg->port_id;
         _ap_instance->flows[cfd].oflags  = FLOW_O_DEFAULT;
+        _ap_instance->flows[cfd].api     = recv_msg->api;
 
         pthread_rwlock_unlock(&_ap_instance->flows_lock);
         pthread_rwlock_unlock(&_ap_instance->data_lock);
@@ -321,8 +322,7 @@ int flow_alloc(char * dst_name,
 
         _ap_instance->flows[fd].port_id = recv_msg->port_id;
         _ap_instance->flows[fd].oflags  = FLOW_O_DEFAULT;
-        _ap_instance->flows[fd].api     =
-                shm_ap_rbuff_get_api(_ap_instance->flows[fd].rb);
+        _ap_instance->flows[fd].api     = recv_msg->api;
 
         pthread_rwlock_unlock(&_ap_instance->flows_lock);
         pthread_rwlock_unlock(&_ap_instance->data_lock);
diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c
index 62ef5cf1..1c7fd600 100644
--- a/src/lib/shm_ap_rbuff.c
+++ b/src/lib/shm_ap_rbuff.c
@@ -462,19 +462,6 @@ ssize_t shm_ap_rbuff_read_port_b(struct shm_ap_rbuff * rb,
         return idx;
 }
 
-pid_t shm_ap_rbuff_get_api(struct shm_ap_rbuff *rb)
-{
-        pid_t api = -1;
-        if (rb == NULL)
-                return -1;
-
-        pthread_mutex_lock(rb->lock);
-        api = rb->api;
-        pthread_mutex_unlock(rb->lock);
-
-        return api;
-}
-
 void shm_ap_rbuff_reset(struct shm_ap_rbuff * rb)
 {
         if (rb == NULL)
diff --git a/src/lib/shm_du_map.c b/src/lib/shm_du_map.c
index 3e2c99d4..9ca282b9 100644
--- a/src/lib/shm_du_map.c
+++ b/src/lib/shm_du_map.c
@@ -91,14 +91,11 @@ static void garbage_collect(struct shm_du_map * dum)
 {
 #ifdef SHM_DU_MAP_MULTI_BLOCK
         struct shm_du_buff * sdb;
-        while (!shm_map_empty(dum) &&
-               (sdb = get_tail_ptr(dum))->dst_api == -1)
-
+        while (!shm_map_empty(dum) && (sdb = get_tail_ptr(dum))->dst_api == -1)
                 *dum->ptr_tail = (*dum->ptr_tail + sdb->blocks)
                         & (SHM_BUFFER_SIZE - 1);
 #else
-        while (!shm_map_empty(dum) &&
-               get_tail_ptr(dum)->dst_api == -1)
+        while (!shm_map_empty(dum) && get_tail_ptr(dum)->dst_api == -1)
                 *dum->ptr_tail =
                         (*dum->ptr_tail + 1) & (SHM_BUFFER_SIZE - 1);
 
@@ -296,8 +293,7 @@ void * shm_du_map_sanitize(void * o)
                 struct timespec now;
                 struct timespec dl;
 
-                if (pthread_cond_wait(dum->full, dum->lock)
-                        == EOWNERDEAD) {
+                if (pthread_cond_wait(dum->full, dum->lock) == EOWNERDEAD) {
                         LOG_WARN("Recovering dead mutex.");
                         pthread_mutex_consistent(dum->lock);
                 }
-- 
cgit v1.2.3