diff options
| author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-06-29 15:47:50 +0200 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-06-29 15:47:50 +0200 | 
| commit | 278abed7b636f3368dcfd3b54200d31517e7142b (patch) | |
| tree | 38359556d0bf0a82bcc27ed2c53c64c29ea3a7d2 /src | |
| parent | a19521aa74edfa4a2eb62466b04c9264c3b6576c (diff) | |
| parent | 205690cb7ceb14de5f4478df721a6c1060536924 (diff) | |
| download | ouroboros-278abed7b636f3368dcfd3b54200d31517e7142b.tar.gz ouroboros-278abed7b636f3368dcfd3b54200d31517e7142b.zip | |
Merged in dstaesse/ouroboros/be-irmd-auto (pull request #145)
irmd: fix lockup and cond_signal skip
Diffstat (limited to 'src')
| -rw-r--r-- | src/irmd/main.c | 30 | 
1 files changed, 18 insertions, 12 deletions
| diff --git a/src/irmd/main.c b/src/irmd/main.c index f6c27377..5ff84da1 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -709,7 +709,7 @@ static int registry_add_ap_auto(char *  name,          a->ap_name = ap_name;          a->argv    = argv; -        if(e->state == REG_NAME_IDLE) +        if (e->state == REG_NAME_IDLE)                  e->state = REG_NAME_AUTO_ACCEPT;          list_add(&a->next, &e->auto_ap_info); @@ -741,7 +741,7 @@ static int registry_remove_ap_auto(char * name,          list_del(&a->next); -        if(e->state == REG_NAME_AUTO_ACCEPT && list_empty(&e->auto_ap_info)) +        if (e->state == REG_NAME_AUTO_ACCEPT && list_empty(&e->auto_ap_info))                  e->state = REG_NAME_IDLE;          return 0; @@ -784,7 +784,8 @@ static struct reg_instance * registry_add_ap_instance(char * name,                  return NULL;          } -        if(e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT) { +        if (e->state == REG_NAME_IDLE || e->state == REG_NAME_AUTO_ACCEPT +           || e->state == REG_NAME_AUTO_EXEC) {                  e->state = REG_NAME_FLOW_ACCEPT;                  pthread_cond_signal(&e->acc_signal);          } @@ -1640,6 +1641,7 @@ static struct port_map_entry * flow_req_arr(pid_t  api,          struct port_map_entry * pme = NULL;          bool acc_wait = true; +        enum reg_name_state state;          pme = port_map_entry_create();          if (pme == NULL) { @@ -1665,16 +1667,18 @@ static struct port_map_entry * flow_req_arr(pid_t  api,          }          pthread_mutex_lock(&rne->state_lock); +        state = rne->state; +        pthread_mutex_unlock(&rne->state_lock); -        switch (rne->state) { +        switch (state) {          case REG_NAME_IDLE: -                pthread_mutex_unlock(&rne->state_lock);                  pthread_rwlock_unlock(&instance->reg_lock);                  pthread_rwlock_unlock(&instance->state_lock);                  LOG_ERR("No AP's for %s.", dst_name);                  free(pme);                  return NULL;          case REG_NAME_AUTO_ACCEPT: +                pthread_mutex_lock(&rne->state_lock);                  rne->state = REG_NAME_AUTO_EXEC;                  pthread_mutex_unlock(&rne->state_lock); @@ -1685,6 +1689,8 @@ static struct port_map_entry * flow_req_arr(pid_t  api,                          return NULL;                  } +                pthread_rwlock_unlock(&instance->reg_lock); +                  pthread_mutex_lock(&rne->state_lock);                  pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock,                                       (void *) &rne->state_lock); @@ -1693,13 +1699,13 @@ static struct port_map_entry * flow_req_arr(pid_t  api,                          pthread_cond_wait(&rne->acc_signal,                                            &rne->state_lock); -                pthread_cleanup_pop(false); +                pthread_cleanup_pop(true); -        case REG_NAME_FLOW_ACCEPT: -                pthread_mutex_unlock(&rne->state_lock); +                pthread_rwlock_rdlock(&instance->reg_lock); +        case REG_NAME_FLOW_ACCEPT:                  pme->n_api = registry_resolve_api(rne); -                if(pme->n_api == 0) { +                if (pme->n_api == 0) {                          pthread_rwlock_unlock(&instance->reg_lock);                          pthread_rwlock_unlock(&instance->state_lock);                          LOG_ERR("Invalid api returned."); @@ -1708,7 +1714,6 @@ static struct port_map_entry * flow_req_arr(pid_t  api,                  break;          default: -                pthread_mutex_unlock(&rne->state_lock);                  pthread_rwlock_unlock(&instance->reg_lock);                  pthread_rwlock_unlock(&instance->state_lock);                  LOG_ERR("IRMd in wrong state."); @@ -1717,6 +1722,7 @@ static struct port_map_entry * flow_req_arr(pid_t  api,          }          pthread_rwlock_unlock(&instance->reg_lock); +          pthread_rwlock_wrlock(&instance->flows_lock);          pme->port_id = bmp_allocate(instance->port_ids); @@ -1904,7 +1910,7 @@ void * irm_flow_cleaner()                                     IRMD_CLEANUP_TIMER % BILLION};          while (true) { -                if(clock_gettime(CLOCK_MONOTONIC, &now) < 0) +                if (clock_gettime(CLOCK_MONOTONIC, &now) < 0)                          LOG_WARN("Failed to get time.");                  /* cleanup stale PENDING flows */ @@ -2305,7 +2311,7 @@ int main()          pthread_create(&instance->cleanup_flows, NULL, irm_flow_cleaner, NULL);          pthread_create(&instance->shm_sanitize, NULL, -                       shm_du_map_sanitize, NULL); +                       shm_du_map_sanitize, instance->dum);          /* wait for (all of them) to return */          for (t = 0; t < IRMD_THREADPOOL_SIZE; ++t) | 
