diff options
| -rw-r--r-- | src/ipcpd/local/main.c | 11 | ||||
| -rw-r--r-- | src/ipcpd/shim-udp/main.c | 11 | ||||
| -rw-r--r-- | src/lib/shm_ap_rbuff.c | 4 | 
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); | 
