summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-29 10:15:22 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-29 10:15:54 +0200
commit462a3fb9b915dedf8b061b68a4db93f6e22ab29d (patch)
tree27d596fc4403363cfda9af734fc54edfad5258bd /src
parentee1974debcfba8d8b10ea9a60437d04502b965dc (diff)
downloadouroboros-462a3fb9b915dedf8b061b68a4db93f6e22ab29d.tar.gz
ouroboros-462a3fb9b915dedf8b061b68a4db93f6e22ab29d.zip
ipcpd: fixes shutdown lockup in local and shim-udp
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/local/main.c11
-rw-r--r--src/ipcpd/shim-udp/main.c11
-rw-r--r--src/lib/shm_ap_rbuff.c4
3 files changed, 12 insertions, 14 deletions
diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c
index b07b0a52..4a0ad683 100644
--- a/src/ipcpd/local/main.c
+++ b/src/ipcpd/local/main.c
@@ -201,6 +201,11 @@ static void * ipcp_local_sdu_loop(void * o)
struct rb_entry * e;
int fd;
+ e = shm_ap_rbuff_read(_ap_instance->rb);
+ if (e == NULL) {
+ continue;
+ }
+
rw_lock_rdlock(&_ipcp->state_lock);
if (_ipcp->state != IPCP_ENROLLED) {
@@ -208,12 +213,6 @@ static void * ipcp_local_sdu_loop(void * o)
return (void *) 1; /* -ENOTENROLLED */
}
- e = shm_ap_rbuff_read(_ap_instance->rb);
- if (e == NULL) {
- rw_lock_unlock(&_ipcp->state_lock);
- continue;
- }
-
rw_lock_rdlock(&_ap_instance->flows_lock);
fd = _ap_instance->in_out[port_id_to_fd(e->port_id)];
if (fd == -1) {
diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c
index 33b4be2f..48fa141e 100644
--- a/src/ipcpd/shim-udp/main.c
+++ b/src/ipcpd/shim-udp/main.c
@@ -775,6 +775,11 @@ static void * ipcp_udp_sdu_loop(void * o)
int len = 0;
char * buf;
+ e = shm_ap_rbuff_read(_ap_instance->rb);
+ if (e == NULL) {
+ continue;
+ }
+
rw_lock_rdlock(&_ipcp->state_lock);
if (_ipcp->state != IPCP_ENROLLED) {
@@ -782,12 +787,6 @@ static void * ipcp_udp_sdu_loop(void * o)
return (void *) 1; /* -ENOTENROLLED */
}
- e = shm_ap_rbuff_read(_ap_instance->rb);
- if (e == NULL) {
- rw_lock_unlock(&_ipcp->state_lock);
- continue;
- }
-
len = shm_du_map_read_sdu((uint8_t **) &buf,
_ap_instance->dum,
e->index);
diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c
index 666e053f..a855ed8f 100644
--- a/src/lib/shm_ap_rbuff.c
+++ b/src/lib/shm_ap_rbuff.c
@@ -259,9 +259,9 @@ struct rb_entry * shm_ap_rbuff_read(struct shm_ap_rbuff * rb)
return NULL;
pthread_cleanup_push((void(*)(void *))pthread_mutex_unlock,
- (void*) rb->shm_mutex);
-
+ (void *) rb->shm_mutex);
pthread_mutex_lock(rb->shm_mutex);
+
while(shm_rbuff_empty(rb))
pthread_cond_wait(rb->work, rb->shm_mutex);