diff options
| author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-08-09 16:56:04 +0200 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-08-09 16:56:04 +0200 | 
| commit | fa719e594be2a6d3132706c11166fd4ad4d57e01 (patch) | |
| tree | b2f1805087a2c1f1b22d4ff489bcb6d77d4d20fb /src/lib | |
| parent | f558d4404a9cb5b87ce3e239d8c0712bbaaba39a (diff) | |
| parent | dc0e2a74d74f524f1d94140827d88479d42acd69 (diff) | |
| download | ouroboros-fa719e594be2a6d3132706c11166fd4ad4d57e01.tar.gz ouroboros-fa719e594be2a6d3132706c11166fd4ad4d57e01.zip | |
Merged in dstaesse/ouroboros/be-bugfixing (pull request #196)
lib: dev.c: Release locks before blocking calls
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dev.c | 31 | 
1 files changed, 23 insertions, 8 deletions
| diff --git a/src/lib/dev.c b/src/lib/dev.c index 3c31ce6d..cc332233 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -503,12 +503,21 @@ ssize_t flow_write(int fd, void * buf, size_t count)                          return -1;                  }          } else { /* blocking */ -                idx = shm_du_map_write_b(_ap_instance->dum, -                                         _ap_instance->flows[fd].api, +                struct shm_du_map * dum = _ap_instance->dum; +                pid_t               api = _ap_instance->flows[fd].api; +                pthread_rwlock_unlock(&_ap_instance->flows_lock); +                pthread_rwlock_unlock(&_ap_instance->data_lock); + +                idx = shm_du_map_write_b(dum, +                                         api,                                           DU_BUFF_HEADSPACE,                                           DU_BUFF_TAILSPACE,                                           (uint8_t *) buf,                                           count); + +                pthread_rwlock_rdlock(&_ap_instance->data_lock); +                pthread_rwlock_rdlock(&_ap_instance->flows_lock); +                  e.index   = idx;                  e.port_id = _ap_instance->flows[fd].port_id; @@ -548,15 +557,21 @@ ssize_t flow_read(int fd, void * buf, size_t count)                  return -ENOTALLOC;          } -        if (_ap_instance->flows[fd].oflags & FLOW_O_NONBLOCK) +        if (_ap_instance->flows[fd].oflags & FLOW_O_NONBLOCK) {                  idx = shm_ap_rbuff_read_port(_ap_instance->rb,                                               _ap_instance->flows[fd].port_id); -        else -                idx = shm_ap_rbuff_read_port_b(_ap_instance->rb, -                                               _ap_instance->flows[fd].port_id, -                                               _ap_instance->flows[fd].timeout); +                pthread_rwlock_unlock(&_ap_instance->flows_lock); +        } else { +                struct shm_ap_rbuff * rb      = _ap_instance->rb; +                int                   port_id = _ap_instance->flows[fd].port_id; +                struct timespec *     timeout = _ap_instance->flows[fd].timeout; +                pthread_rwlock_unlock(&_ap_instance->flows_lock); +                pthread_rwlock_unlock(&_ap_instance->data_lock); -        pthread_rwlock_unlock(&_ap_instance->flows_lock); +                idx = shm_ap_rbuff_read_port_b(rb, port_id, timeout); + +                pthread_rwlock_rdlock(&_ap_instance->data_lock); +        }          if (idx < 0) {                  pthread_rwlock_unlock(&_ap_instance->data_lock); | 
