diff options
author | dimitri staessens <[email protected]> | 2016-08-09 16:06:12 +0200 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2016-08-09 16:06:12 +0200 |
commit | 9dce327e10bffddc9dc5058f06407e8ff12389b7 (patch) | |
tree | 97c4672e8e912efbbaf1a4e1cf3077a0cfe402b4 | |
parent | 067c5661859f6a1f75adb0bb325d1641fed221a1 (diff) | |
download | ouroboros-9dce327e10bffddc9dc5058f06407e8ff12389b7.tar.gz ouroboros-9dce327e10bffddc9dc5058f06407e8ff12389b7.zip |
lib: Various fixes
Fix missing set of api upon flow_alloc.
Various locking fixes.
-rw-r--r-- | include/ouroboros/shm_ap_rbuff.h | 1 | ||||
-rw-r--r-- | src/irmd/main.c | 16 | ||||
-rw-r--r-- | src/irmd/reg_api.c | 5 | ||||
-rw-r--r-- | src/irmd/registry.c | 4 | ||||
-rw-r--r-- | src/lib/dev.c | 4 | ||||
-rw-r--r-- | src/lib/shm_ap_rbuff.c | 13 | ||||
-rw-r--r-- | src/lib/shm_du_map.c | 10 |
7 files changed, 26 insertions, 27 deletions
diff --git a/include/ouroboros/shm_ap_rbuff.h b/include/ouroboros/shm_ap_rbuff.h index 50b077f0..a1949122 100644 --- a/include/ouroboros/shm_ap_rbuff.h +++ b/include/ouroboros/shm_ap_rbuff.h @@ -49,6 +49,5 @@ ssize_t shm_ap_rbuff_read_port(struct shm_ap_rbuff * rb, ssize_t shm_ap_rbuff_read_port_b(struct shm_ap_rbuff * rb, int port_id, const struct timespec * timeout); -pid_t shm_ap_rbuff_get_api(struct shm_ap_rbuff * rb); void shm_ap_rbuff_reset(struct shm_ap_rbuff * rb); #endif /* OUROBOROS_SHM_AP_RBUFF_H */ diff --git a/src/irmd/main.c b/src/irmd/main.c index a79330ef..c7c1566d 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -524,6 +524,9 @@ static ssize_t list_ipcps(char * name, ssize_t count = 0; int i = 0; + pthread_rwlock_rdlock(&irmd->state_lock); + pthread_rwlock_rdlock(&irmd->reg_lock); + list_for_each(pos, &irmd->ipcps) { struct ipcp_entry * tmp = list_entry(pos, struct ipcp_entry, next); @@ -535,6 +538,8 @@ static ssize_t list_ipcps(char * name, *apis = malloc(count * sizeof(pid_t)); if (*apis == NULL) { + pthread_rwlock_unlock(&irmd->reg_lock); + pthread_rwlock_unlock(&irmd->state_lock); return -1; } @@ -547,6 +552,9 @@ static ssize_t list_ipcps(char * name, } } + pthread_rwlock_unlock(&irmd->reg_lock); + pthread_rwlock_unlock(&irmd->state_lock); + return count; } @@ -884,6 +892,7 @@ static void cleanup_alloc_res(void * o) struct irm_flow * f = (struct irm_flow *) o; if (f->state == FLOW_PENDING) f->state = FLOW_NULL; + pthread_cond_broadcast(&f->state_cond); pthread_mutex_unlock(&f->state_lock); } @@ -936,6 +945,7 @@ static int flow_alloc_res(int port_id) pthread_mutex_lock(&f->state_lock); if (f->state == FLOW_ALLOCATED) { + pthread_cond_broadcast(&f->state_cond); pthread_mutex_unlock(&f->state_lock); pthread_rwlock_unlock(&irmd->flows_lock); pthread_rwlock_unlock(&irmd->state_lock); @@ -943,7 +953,7 @@ static int flow_alloc_res(int port_id) } f->state = FLOW_NULL; - pthread_cond_signal(&f->state_cond); + pthread_cond_broadcast(&f->state_cond); pthread_mutex_unlock(&f->state_lock); pthread_rwlock_unlock(&irmd->flows_lock); pthread_rwlock_unlock(&irmd->state_lock); @@ -1040,7 +1050,7 @@ static struct irm_flow * flow_req_arr(pid_t api, LOG_WARN("Failed to set timestamp."); pthread_rwlock_rdlock(&irmd->state_lock); - pthread_rwlock_rdlock(&irmd->reg_lock); + pthread_rwlock_wrlock(&irmd->reg_lock); rne = registry_get_entry_by_name(&irmd->registry, dst_name); if (rne == NULL) { @@ -1172,7 +1182,7 @@ static int flow_alloc_reply(int port_id, struct irm_flow * f; pthread_rwlock_rdlock(&irmd->state_lock); - pthread_rwlock_rdlock(&irmd->flows_lock); + pthread_rwlock_wrlock(&irmd->flows_lock); f = get_irm_flow(port_id); if (f == NULL) { diff --git a/src/irmd/reg_api.c b/src/irmd/reg_api.c index d50f89e8..648dc1b3 100644 --- a/src/irmd/reg_api.c +++ b/src/irmd/reg_api.c @@ -111,8 +111,11 @@ void reg_api_wake(struct reg_api * i) pthread_cond_broadcast(&i->state_cond); + pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, + (void *) &i->state_lock); + while (i->state == REG_I_WAKE) pthread_cond_wait(&i->state_cond, &i->state_lock); - pthread_mutex_unlock(&i->state_lock); + pthread_cleanup_pop(true); } diff --git a/src/irmd/registry.c b/src/irmd/registry.c index ec1c3987..ae8c3b0a 100644 --- a/src/irmd/registry.c +++ b/src/irmd/registry.c @@ -503,6 +503,8 @@ struct reg_api * registry_add_api_name(struct list_head * registry, return NULL; } + pthread_mutex_lock(&e->state_lock); + if (e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT || e->state == REG_NAME_AUTO_EXEC) { e->state = REG_NAME_FLOW_ACCEPT; @@ -511,6 +513,8 @@ struct reg_api * registry_add_api_name(struct list_head * registry, list_add(&i->next, &e->reg_apis); + pthread_mutex_unlock(&e->state_lock); + return i; } diff --git a/src/lib/dev.c b/src/lib/dev.c index 6f0de8c8..3c31ce6d 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -203,6 +203,7 @@ int flow_accept(char ** ae_name) _ap_instance->flows[cfd].port_id = recv_msg->port_id; _ap_instance->flows[cfd].oflags = FLOW_O_DEFAULT; + _ap_instance->flows[cfd].api = recv_msg->api; pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); @@ -321,8 +322,7 @@ int flow_alloc(char * dst_name, _ap_instance->flows[fd].port_id = recv_msg->port_id; _ap_instance->flows[fd].oflags = FLOW_O_DEFAULT; - _ap_instance->flows[fd].api = - shm_ap_rbuff_get_api(_ap_instance->flows[fd].rb); + _ap_instance->flows[fd].api = recv_msg->api; pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c index 62ef5cf1..1c7fd600 100644 --- a/src/lib/shm_ap_rbuff.c +++ b/src/lib/shm_ap_rbuff.c @@ -462,19 +462,6 @@ ssize_t shm_ap_rbuff_read_port_b(struct shm_ap_rbuff * rb, return idx; } -pid_t shm_ap_rbuff_get_api(struct shm_ap_rbuff *rb) -{ - pid_t api = -1; - if (rb == NULL) - return -1; - - pthread_mutex_lock(rb->lock); - api = rb->api; - pthread_mutex_unlock(rb->lock); - - return api; -} - void shm_ap_rbuff_reset(struct shm_ap_rbuff * rb) { if (rb == NULL) diff --git a/src/lib/shm_du_map.c b/src/lib/shm_du_map.c index 3e2c99d4..9ca282b9 100644 --- a/src/lib/shm_du_map.c +++ b/src/lib/shm_du_map.c @@ -91,14 +91,11 @@ static void garbage_collect(struct shm_du_map * dum) { #ifdef SHM_DU_MAP_MULTI_BLOCK struct shm_du_buff * sdb; - while (!shm_map_empty(dum) && - (sdb = get_tail_ptr(dum))->dst_api == -1) - + while (!shm_map_empty(dum) && (sdb = get_tail_ptr(dum))->dst_api == -1) *dum->ptr_tail = (*dum->ptr_tail + sdb->blocks) & (SHM_BUFFER_SIZE - 1); #else - while (!shm_map_empty(dum) && - get_tail_ptr(dum)->dst_api == -1) + while (!shm_map_empty(dum) && get_tail_ptr(dum)->dst_api == -1) *dum->ptr_tail = (*dum->ptr_tail + 1) & (SHM_BUFFER_SIZE - 1); @@ -296,8 +293,7 @@ void * shm_du_map_sanitize(void * o) struct timespec now; struct timespec dl; - if (pthread_cond_wait(dum->full, dum->lock) - == EOWNERDEAD) { + if (pthread_cond_wait(dum->full, dum->lock) == EOWNERDEAD) { LOG_WARN("Recovering dead mutex."); pthread_mutex_consistent(dum->lock); } |