diff options
| -rw-r--r-- | src/ipcpd/normal/dt.c | 6 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/link_state.c | 2 | ||||
| -rw-r--r-- | src/lib/notifier.c | 5 | 
3 files changed, 10 insertions, 3 deletions
| diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index dc7343f1..54346458 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -532,12 +532,14 @@ static void packet_handler(int                  fd,                          if (ipcp_flow_write(dt_pci.eid, sdb)) {                                  ipcp_sdb_release(sdb);  #ifdef IPCP_FLOW_STATS -                                pthread_mutex_lock(&dt.stat[dt_pci.eid].lock); +                                pthread_mutex_lock(&dt.stat[fd].lock);                                  ++dt.stat[fd].rcv_pkt[qc];                                  dt.stat[fd].rcv_bytes[qc] += len; +                                pthread_mutex_unlock(&dt.stat[fd].lock); + +                                pthread_mutex_lock(&dt.stat[dt_pci.eid].lock);                                  ++dt.stat[dt_pci.eid].w_drp_pkt[qc];                                  dt.stat[dt_pci.eid].w_drp_bytes[qc] += len; -                                  pthread_mutex_unlock(&dt.stat[dt_pci.eid].lock);  #endif diff --git a/src/ipcpd/normal/pol/link_state.c b/src/ipcpd/normal/pol/link_state.c index 8db1a9c5..e8677f0d 100644 --- a/src/ipcpd/normal/pol/link_state.c +++ b/src/ipcpd/normal/pol/link_state.c @@ -795,7 +795,9 @@ static void handle_event(void *       self,                  if (lsdb_add_link(ipcpi.dt_addr, c->conn_info.addr, 0, &qs))                          log_dbg("Failed to add new adjacency to LSDB."); +                pthread_rwlock_rdlock(&ls.db_lock);                  send_lsm(ipcpi.dt_addr, c->conn_info.addr, 0); +                pthread_rwlock_unlock(&ls.db_lock);                  break;          case NOTIFY_DT_CONN_DEL: diff --git a/src/lib/notifier.c b/src/lib/notifier.c index 593a0e70..4f77f2e3 100644 --- a/src/lib/notifier.c +++ b/src/lib/notifier.c @@ -75,12 +75,15 @@ void notifier_event(int          event,          pthread_rwlock_rdlock(¬ifier.lock); +        pthread_cleanup_push((void (*) (void *)) pthread_rwlock_unlock, +                             (void *) ¬ifier.lock) +          list_for_each(p, ¬ifier.listeners) {                  struct listener * l = list_entry(p, struct listener, next);                  l->callback(l->obj, event, o);          } -        pthread_rwlock_unlock(¬ifier.lock); +        pthread_cleanup_pop(true);  }  int notifier_reg(notifier_fn_t callback, | 
