From e7aa1ba135d358a0c03c9bcb7157c86a6d9e95c5 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 28 May 2016 22:13:24 +0200 Subject: lib: shm_ap_rbuff: sleep when read on empty rbuff When the ring buffer is empty, a read call will sleep. A write call on an empty ring buffer will wake up sleeping readers. --- src/ipcpd/shim-udp/main.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/ipcpd/shim-udp') diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index c6c16ebf..33b4be2f 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -783,7 +783,6 @@ static void * ipcp_udp_sdu_loop(void * o) } e = shm_ap_rbuff_read(_ap_instance->rb); - if (e == NULL) { rw_lock_unlock(&_ipcp->state_lock); continue; -- cgit v1.2.3 From 462a3fb9b915dedf8b061b68a4db93f6e22ab29d Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sun, 29 May 2016 10:15:22 +0200 Subject: ipcpd: fixes shutdown lockup in local and shim-udp --- src/ipcpd/local/main.c | 11 +++++------ src/ipcpd/shim-udp/main.c | 11 +++++------ src/lib/shm_ap_rbuff.c | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) (limited to 'src/ipcpd/shim-udp') 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); -- cgit v1.2.3