summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-08-09 16:06:12 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-08-09 16:06:12 +0200
commit9dce327e10bffddc9dc5058f06407e8ff12389b7 (patch)
tree97c4672e8e912efbbaf1a4e1cf3077a0cfe402b4 /src/irmd/main.c
parent067c5661859f6a1f75adb0bb325d1641fed221a1 (diff)
downloadouroboros-9dce327e10bffddc9dc5058f06407e8ff12389b7.tar.gz
ouroboros-9dce327e10bffddc9dc5058f06407e8ff12389b7.zip
lib: Various fixes
Fix missing set of api upon flow_alloc. Various locking fixes.
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c16
1 files changed, 13 insertions, 3 deletions
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) {