summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-10 12:01:39 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-10 12:01:39 +0200
commit2407d44fbe3a7ead5c7be0231688d114e009bc51 (patch)
tree8bf40f5d923f10c7231b7b6b922a6ade8c21fe55 /src/irmd/main.c
parenta704cdbb3fd038b1550047f4a22059983019290f (diff)
downloadouroboros-2407d44fbe3a7ead5c7be0231688d114e009bc51.tar.gz
ouroboros-2407d44fbe3a7ead5c7be0231688d114e009bc51.zip
irmd: fixed potential data races
bmp_allocate should be called under lock. Helgrind does not give warnings anymore during flow allocation.
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index f4c203e0..f8a5f2d5 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -440,7 +440,7 @@ static int destroy_ipcp(instance_name_t * api)
return 0;
}
- pid =api->id;
+ pid = api->id;
if (ipcp_destroy(api->id))
LOG_ERR("Could not destroy IPCP.");
@@ -837,13 +837,14 @@ static struct port_map_entry * flow_alloc(pid_t pid,
return NULL;
}
- pme->port_id = bmp_allocate(instance->port_ids);
pme->n_pid = pid;
pme->state = FLOW_PENDING;
- pme->n_1_pid = get_ipcp_by_dst_name(dst_name)->id;
pthread_mutex_lock(&instance->r_lock);
+ pme->port_id = bmp_allocate(instance->port_ids);
+ pme->n_1_pid = get_ipcp_by_dst_name(dst_name)->id;
+
list_add(&pme->next, &instance->port_map);
ipcp = get_ipcp_by_dst_name(dst_name);
@@ -960,12 +961,13 @@ static struct port_map_entry * flow_req_arr(pid_t pid,
return NULL;
}
- pme->port_id = bmp_allocate(instance->port_ids);
pme->state = FLOW_PENDING;
pme->n_1_pid = pid;
pthread_mutex_lock(&instance->r_lock);
+ pme->port_id = bmp_allocate(instance->port_ids);
+
rne = get_reg_name_entry_by_name(dst_name);
if (rne == NULL) {
pthread_mutex_unlock(&instance->r_lock);
@@ -974,7 +976,7 @@ static struct port_map_entry * flow_req_arr(pid_t pid,
return NULL;
}
- pme->n_pid = rne->api->id;
+ pme->n_pid = rne->api->id;
list_add(&pme->next, &instance->port_map);
@@ -983,11 +985,11 @@ static struct port_map_entry * flow_req_arr(pid_t pid,
rne->flow_arrived = true;
- pthread_mutex_unlock(&instance->r_lock);
-
if (pthread_cond_signal(&rne->acc_signal))
LOG_ERR("Failed to send signal.");
+ pthread_mutex_unlock(&instance->r_lock);
+
return pme;
}
@@ -1015,9 +1017,9 @@ static int flow_alloc_reply(int port_id,
else
e->state = FLOW_NULL;
- pthread_mutex_unlock(&instance->r_lock);
if (pthread_cond_signal(&e->res_signal))
LOG_ERR("Failed to send signal.");
+ pthread_mutex_unlock(&instance->r_lock);
return 0;
}