diff options
| -rw-r--r-- | src/ipcpd/local/main.c | 35 | ||||
| -rw-r--r-- | src/lib/shm_rbuff_ll.c | 4 | 
2 files changed, 5 insertions, 34 deletions
| diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index a49a5b97..3e5c4803 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -89,19 +89,12 @@ static void * ipcp_local_sdu_loop(void * o)                  int fd;                  ssize_t idx; -                pthread_rwlock_rdlock(&ipcpi.state_lock); - -                if (ipcp_get_state() != IPCP_OPERATIONAL) { -                        pthread_rwlock_unlock(&ipcpi.state_lock); +                if (ipcp_get_state() != IPCP_OPERATIONAL)                          return (void *) 1; /* -ENOTENROLLED */ -                } - -                pthread_rwlock_unlock(&ipcpi.state_lock);                  flow_event_wait(local_data.flows, local_data.fq, &timeout);                  while ((fd = fqueue_next(local_data.fq)) >= 0) { -                        pthread_rwlock_rdlock(&ipcpi.state_lock);                          pthread_rwlock_rdlock(&local_data.lock);                          idx = local_flow_read(fd); @@ -114,7 +107,6 @@ static void * ipcp_local_sdu_loop(void * o)                                  local_flow_write(fd, idx);                          pthread_rwlock_unlock(&local_data.lock); -                        pthread_rwlock_unlock(&ipcpi.state_lock);                  }          } @@ -134,15 +126,11 @@ void ipcp_sig_handler(int         sig,          case SIGHUP:          case SIGQUIT:                  if (info->si_pid == ipcpi.irmd_api) { -                        pthread_rwlock_wrlock(&ipcpi.state_lock); -                          if (ipcp_get_state() == IPCP_INIT)                                  ipcp_set_state(IPCP_NULL);                          if (ipcp_get_state() == IPCP_OPERATIONAL)                                  ipcp_set_state(IPCP_SHUTDOWN); - -                        pthread_rwlock_unlock(&ipcpi.state_lock);                  }          default:                  return; @@ -156,10 +144,7 @@ static int ipcp_local_bootstrap(struct dif_config * conf)          assert(conf);          assert(conf->type == THIS_TYPE); -        pthread_rwlock_wrlock(&ipcpi.state_lock); -          if (ipcp_get_state() != IPCP_INIT) { -                pthread_rwlock_unlock(&ipcpi.state_lock);                  log_err("IPCP in wrong state.");                  return -1;          } @@ -168,8 +153,6 @@ static int ipcp_local_bootstrap(struct dif_config * conf)          pthread_create(&local_data.sduloop, NULL, ipcp_local_sdu_loop, NULL); -        pthread_rwlock_unlock(&ipcpi.state_lock); -          log_info("Bootstrapped local IPCP with api %d.", getpid());          return 0; @@ -235,10 +218,7 @@ static int ipcp_local_flow_alloc(int       fd,          assert(dst_name); -        pthread_rwlock_rdlock(&ipcpi.state_lock); -          if (ipcp_get_state() != IPCP_OPERATIONAL) { -                pthread_rwlock_unlock(&ipcpi.state_lock);                  log_dbg("Won't allocate over non-operational IPCP.");                  return -1; /* -ENOTENROLLED */          } @@ -253,7 +233,7 @@ static int ipcp_local_flow_alloc(int       fd,          out_fd = ipcp_flow_req_arr(getpid(), dst_name, cube);          if (out_fd < 0) { -                pthread_rwlock_unlock(&ipcpi.state_lock); +                pthread_rwlock_unlock(&local_data.lock);                  log_dbg("Flow allocation failed: %d", out_fd);                  return -1;          } @@ -270,7 +250,6 @@ static int ipcp_local_flow_alloc(int       fd,          local_data.in_out[out_fd] = fd;          pthread_rwlock_unlock(&local_data.lock); -        pthread_rwlock_unlock(&ipcpi.state_lock);          flow_set_add(local_data.flows, fd); @@ -285,7 +264,6 @@ static int ipcp_local_flow_alloc_resp(int fd,          int out_fd = -1;          int ret = -1; -        pthread_rwlock_rdlock(&ipcpi.state_lock);          pthread_rwlock_wrlock(&local_data.lock);          if (response) { @@ -293,19 +271,16 @@ static int ipcp_local_flow_alloc_resp(int fd,                          local_data.in_out[local_data.in_out[fd]] = fd;                  local_data.in_out[fd] = -1;                  pthread_rwlock_unlock(&local_data.lock); -                pthread_rwlock_unlock(&ipcpi.state_lock);                  return 0;          }          out_fd = local_data.in_out[fd];          if (out_fd == -1) {                  pthread_rwlock_unlock(&local_data.lock); -                pthread_rwlock_unlock(&ipcpi.state_lock);                  return -1;          }          pthread_rwlock_unlock(&local_data.lock); -        pthread_rwlock_unlock(&ipcpi.state_lock);          flow_set_add(local_data.flows, fd); @@ -323,7 +298,6 @@ static int ipcp_local_flow_dealloc(int fd)          ipcp_flow_fini(fd); -        pthread_rwlock_rdlock(&ipcpi.state_lock);          pthread_rwlock_wrlock(&local_data.lock);          flow_set_del(local_data.flows, fd); @@ -331,7 +305,6 @@ static int ipcp_local_flow_dealloc(int fd)          local_data.in_out[fd] = -1;          pthread_rwlock_unlock(&local_data.lock); -        pthread_rwlock_unlock(&ipcpi.state_lock);          flow_dealloc(fd); @@ -409,10 +382,8 @@ int main(int    argc,          ipcp_shutdown(); -        if (ipcp_get_state() == IPCP_SHUTDOWN) { -                pthread_cancel(local_data.sduloop); +        if (ipcp_get_state() == IPCP_SHUTDOWN)                  pthread_join(local_data.sduloop, NULL); -        }          local_data_fini(); diff --git a/src/lib/shm_rbuff_ll.c b/src/lib/shm_rbuff_ll.c index d777de8b..1e072b21 100644 --- a/src/lib/shm_rbuff_ll.c +++ b/src/lib/shm_rbuff_ll.c @@ -244,14 +244,14 @@ int shm_rbuff_write(struct shm_rbuff * rb,          nhead = RB_HEAD; +        *(rb->shm_base + nhead) = (ssize_t) idx; +          do {                  ohead = nhead;                  nhead = (ohead + 1) & ((SHM_BUFFER_SIZE) - 1);                  nhead = __sync_val_compare_and_swap(rb->head, ohead, nhead);          } while (nhead != ohead); -        *(rb->shm_base + nhead) = (ssize_t) idx; -          if (was_empty)                  pthread_cond_broadcast(rb->add); | 
