diff options
Diffstat (limited to 'src')
-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, |