diff options
Diffstat (limited to 'src/irmd')
| -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 | 
3 files changed, 21 insertions, 4 deletions
| 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;  } | 
