diff options
author | Mark Stapp <mjs@voltanet.io> | 2020-07-06 18:55:03 +0200 |
---|---|---|
committer | Mark Stapp <mjs@voltanet.io> | 2020-10-23 14:59:34 +0200 |
commit | b3d6bc6ef0140a194b4bc2993a6aba72ab5d54c9 (patch) | |
tree | b5ef6dcab41d9da516a6ff044056e0faca7b35da | |
parent | Merge pull request #7345 from opensourcerouting/bgp-aggr-suppress (diff) | |
download | frr-b3d6bc6ef0140a194b4bc2993a6aba72ab5d54c9.tar.xz frr-b3d6bc6ef0140a194b4bc2993a6aba72ab5d54c9.zip |
* : update signature of thread_cancel api
Change thread_cancel to take a ** to an event, NULL-check
before dereferencing, and NULL the caller's pointer. Update
many callers to use the new signature.
Signed-off-by: Mark Stapp <mjs@voltanet.io>
38 files changed, 144 insertions, 293 deletions
diff --git a/babeld/babeld.c b/babeld/babeld.c index 09955cfbe..895ede704 100644 --- a/babeld/babeld.c +++ b/babeld/babeld.c @@ -317,13 +317,9 @@ babel_clean_routing_process(void) flush_all_routes(); babel_interface_close_all(); - /* cancel threads */ - if (babel_routing_process->t_read != NULL) { - thread_cancel(babel_routing_process->t_read); - } - if (babel_routing_process->t_update != NULL) { - thread_cancel(babel_routing_process->t_update); - } + /* cancel events */ + thread_cancel(&babel_routing_process->t_read); + thread_cancel(&babel_routing_process->t_update); distribute_list_delete(&babel_routing_process->distribute_ctx); XFREE(MTYPE_BABEL, babel_routing_process); @@ -503,9 +499,7 @@ static void babel_set_timer(struct timeval *timeout) { long msecs = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; - if (babel_routing_process->t_update != NULL) { - thread_cancel(babel_routing_process->t_update); - } + thread_cancel(&(babel_routing_process->t_update)); thread_add_timer_msec(master, babel_main_loop, NULL, msecs, &babel_routing_process->t_update); } diff --git a/bfdd/control.c b/bfdd/control.c index 3b954c64f..4929bf199 100644 --- a/bfdd/control.c +++ b/bfdd/control.c @@ -145,10 +145,7 @@ void control_shutdown(void) { struct bfd_control_socket *bcs; - if (bglobal.bg_csockev) { - thread_cancel(bglobal.bg_csockev); - bglobal.bg_csockev = NULL; - } + thread_cancel(&bglobal.bg_csockev); socket_close(&bglobal.bg_csock); @@ -204,15 +201,8 @@ static void control_free(struct bfd_control_socket *bcs) struct bfd_control_queue *bcq; struct bfd_notify_peer *bnp; - if (bcs->bcs_ev) { - thread_cancel(bcs->bcs_ev); - bcs->bcs_ev = NULL; - } - - if (bcs->bcs_outev) { - thread_cancel(bcs->bcs_outev); - bcs->bcs_outev = NULL; - } + thread_cancel(&(bcs->bcs_ev)); + thread_cancel(&(bcs->bcs_outev)); close(bcs->bcs_sd); @@ -318,10 +308,7 @@ static int control_queue_dequeue(struct bfd_control_socket *bcs) return 1; empty_list: - if (bcs->bcs_outev) { - thread_cancel(bcs->bcs_outev); - bcs->bcs_outev = NULL; - } + thread_cancel(&(bcs->bcs_outev)); bcs->bcs_bout = NULL; return 0; } diff --git a/bgpd/bgp_damp.c b/bgpd/bgp_damp.c index 999216818..94a27ead0 100644 --- a/bgpd/bgp_damp.c +++ b/bgpd/bgp_damp.c @@ -467,10 +467,8 @@ int bgp_damp_disable(struct bgp *bgp, afi_t afi, safi_t safi) if (!CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)) return 0; - /* Cancel reuse thread. */ - if (bdc->t_reuse) - thread_cancel(bdc->t_reuse); - bdc->t_reuse = NULL; + /* Cancel reuse event. */ + thread_cancel(&(bdc->t_reuse)); /* Clean BGP dampening information. */ bgp_damp_info_clean(afi, safi); diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c index abd349a18..975bba931 100644 --- a/bgpd/bgp_dump.c +++ b/bgpd/bgp_dump.c @@ -677,11 +677,8 @@ static int bgp_dump_unset(struct bgp_dump *bgp_dump) bgp_dump->fp = NULL; } - /* Removing interval thread. */ - if (bgp_dump->t_interval) { - thread_cancel(bgp_dump->t_interval); - bgp_dump->t_interval = NULL; - } + /* Removing interval event. */ + thread_cancel(&bgp_dump->t_interval); bgp_dump->interval = 0; diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index 1a58541a7..8f81278de 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -2911,7 +2911,7 @@ void bgp_evpn_mh_finish(void) es_next) { bgp_evpn_es_local_info_clear(es); } - thread_cancel(bgp_mh_info->t_cons_check); + thread_cancel(&bgp_mh_info->t_cons_check); list_delete(&bgp_mh_info->local_es_list); list_delete(&bgp_mh_info->pend_es_list); diff --git a/bgpd/rfapi/rfapi_import.c b/bgpd/rfapi/rfapi_import.c index 68d4f622e..e3581adde 100644 --- a/bgpd/rfapi/rfapi_import.c +++ b/bgpd/rfapi/rfapi_import.c @@ -858,9 +858,9 @@ static void rfapiBgpInfoChainFree(struct bgp_path_info *bpi) if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3093,10 +3093,9 @@ static void rfapiBgpInfoFilteredImportEncap( if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc - .import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3186,9 +3185,9 @@ static void rfapiBgpInfoFilteredImportEncap( "%s: removing holddown bpi matching NVE of new route", __func__); if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3549,10 +3548,9 @@ void rfapiBgpInfoFilteredImportVPN( if (CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc - .import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -3768,9 +3766,9 @@ void rfapiBgpInfoFilteredImportVPN( "%s: removing holddown bpi matching NVE of new route", __func__); if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi->extra->vnc.import.timer; - struct rfapi_withdraw *wcb = t->arg; + struct thread **t = + &(bpi->extra->vnc.import.timer); + struct rfapi_withdraw *wcb = (*t)->arg; XFREE(MTYPE_RFAPI_WITHDRAW, wcb); thread_cancel(t); @@ -4498,12 +4496,11 @@ static void rfapiDeleteRemotePrefixesIt( continue; if (bpi->extra->vnc.import.timer) { - struct thread *t = - (struct thread *)bpi - ->extra->vnc - .import.timer; + struct thread **t = + &(bpi->extra->vnc + .import.timer); struct rfapi_withdraw *wcb = - t->arg; + (*t)->arg; wcb->import_table ->holddown_count[afi] -= diff --git a/bgpd/rfapi/rfapi_monitor.c b/bgpd/rfapi/rfapi_monitor.c index a4b0eff03..ce916c104 100644 --- a/bgpd/rfapi/rfapi_monitor.c +++ b/bgpd/rfapi/rfapi_monitor.c @@ -620,10 +620,7 @@ void rfapiMonitorDel(struct bgp *bgp, struct rfapi_descriptor *rfd, rfapiMonitorDetachImport(m); } - if (m->timer) { - thread_cancel(m->timer); - m->timer = NULL; - } + thread_cancel(&m->timer); /* * remove from rfd list @@ -660,10 +657,7 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd) rfapiMonitorDetachImport(m); } - if (m->timer) { - thread_cancel(m->timer); - m->timer = NULL; - } + thread_cancel(&m->timer); XFREE(MTYPE_RFAPI_MONITOR, m); rn->info = NULL; @@ -697,10 +691,7 @@ int rfapiMonitorDelHd(struct rfapi_descriptor *rfd) #endif } - if (mon_eth->timer) { - thread_cancel(mon_eth->timer); - mon_eth->timer = NULL; - } + thread_cancel(&mon_eth->timer); /* * remove from rfd list @@ -766,8 +757,7 @@ static void rfapiMonitorTimerRestart(struct rfapi_monitor_vpn *m) if (m->rfd->response_lifetime - remain < 2) return; - thread_cancel(m->timer); - m->timer = NULL; + thread_cancel(&m->timer); } { @@ -1078,8 +1068,7 @@ static void rfapiMonitorEthTimerRestart(struct rfapi_monitor_eth *m) if (m->rfd->response_lifetime - remain < 2) return; - thread_cancel(m->timer); - m->timer = NULL; + thread_cancel(&m->timer); } { @@ -1418,10 +1407,7 @@ void rfapiMonitorEthDel(struct bgp *bgp, struct rfapi_descriptor *rfd, rfapiMonitorEthDetachImport(bgp, val); } - if (val->timer) { - thread_cancel(val->timer); - val->timer = NULL; - } + thread_cancel(&val->timer); /* * remove from rfd list diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c index 09832b32a..630a379ec 100644 --- a/bgpd/rfapi/rfapi_rib.c +++ b/bgpd/rfapi/rfapi_rib.c @@ -269,9 +269,8 @@ static void rfapi_info_free(struct rfapi_info *goner) struct rfapi_rib_tcb *tcb; tcb = goner->timer->arg; - thread_cancel(goner->timer); + thread_cancel(&goner->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - goner->timer = NULL; } XFREE(MTYPE_RFAPI_INFO, goner); } @@ -338,13 +337,11 @@ static void rfapiRibStartTimer(struct rfapi_descriptor *rfd, struct agg_node *rn, /* route node attached to */ int deleted) { - struct thread *t = ri->timer; struct rfapi_rib_tcb *tcb = NULL; - if (t) { - tcb = t->arg; - thread_cancel(t); - ri->timer = NULL; + if (ri->timer) { + tcb = ri->timer->arg; + thread_cancel(&ri->timer); } else { tcb = XCALLOC(MTYPE_RFAPI_RECENT_DELETE, sizeof(struct rfapi_rib_tcb)); @@ -917,10 +914,9 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd, if (ri->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ri->timer)->arg; - thread_cancel(ri->timer); + tcb = ri->timer->arg; + thread_cancel(&ri->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ri->timer = NULL; } vnc_zlog_debug_verbose( @@ -1003,11 +999,9 @@ static void process_pending_node(struct bgp *bgp, struct rfapi_descriptor *rfd, if (ori->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ori->timer) - ->arg; - thread_cancel(ori->timer); + tcb = ori->timer->arg; + thread_cancel(&ori->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ori->timer = NULL; } #if DEBUG_PROCESS_PENDING_NODE @@ -1351,11 +1345,9 @@ callback: if (ri->timer) { struct rfapi_rib_tcb *tcb; - tcb = ((struct thread *)ri->timer)->arg; - thread_cancel( - (struct thread *)ri->timer); + tcb = ri->timer->arg; + thread_cancel(&ri->timer); XFREE(MTYPE_RFAPI_RECENT_DELETE, tcb); - ri->timer = NULL; } RFAPI_RIB_CHECK_COUNTS(0, delete_list->count); diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c index b56261669..11f39b2b8 100644 --- a/bgpd/rfapi/vnc_export_bgp.c +++ b/bgpd/rfapi/vnc_export_bgp.c @@ -1711,14 +1711,11 @@ void vnc_direct_bgp_rh_add_route(struct bgp *bgp, afi_t afi, rfapiGetVncLifetime(attr, &eti->lifetime); eti->lifetime = rfapiGetHolddownFromLifetime(eti->lifetime); - if (eti->timer) { - /* - * export expiration timer is already running on - * this route: cancel it - */ - thread_cancel(eti->timer); - eti->timer = NULL; - } + /* + * export expiration timer is already running on + * this route: cancel it + */ + thread_cancel(&eti->timer); bgp_update(peer, prefix, /* prefix */ 0, /* addpath_id */ @@ -1947,15 +1944,12 @@ void vnc_direct_bgp_rh_vpn_enable(struct bgp *bgp, afi_t afi) rfapiGetVncLifetime(ri->attr, &eti->lifetime); - if (eti->timer) { - /* - * export expiration timer is - * already running on - * this route: cancel it - */ - thread_cancel(eti->timer); - eti->timer = NULL; - } + /* + * export expiration timer is + * already running on + * this route: cancel it + */ + thread_cancel(&eti->timer); vnc_zlog_debug_verbose( "%s: calling bgp_update", @@ -2024,8 +2018,7 @@ void vnc_direct_bgp_rh_vpn_disable(struct bgp *bgp, afi_t afi) ZEBRA_ROUTE_VNC_DIRECT_RH, BGP_ROUTE_REDISTRIBUTE); if (eti) { - if (eti->timer) - thread_cancel(eti->timer); + thread_cancel(&eti->timer); vnc_eti_delete(eti); } diff --git a/eigrpd/eigrp_filter.c b/eigrpd/eigrp_filter.c index 9d5d45ca5..010fd2d3a 100644 --- a/eigrpd/eigrp_filter.c +++ b/eigrpd/eigrp_filter.c @@ -159,13 +159,10 @@ void eigrp_distribute_update(struct distribute_ctx *ctx, #endif // TODO: check Graceful restart after 10sec - /* check if there is already GR scheduled */ - if (e->t_distribute != NULL) { - /* if is, cancel schedule */ - thread_cancel(e->t_distribute); - } + /* cancel GR scheduled */ + thread_cancel(&(e->t_distribute)); + /* schedule Graceful restart for whole process in 10sec */ - e->t_distribute = NULL; thread_add_timer(master, eigrp_distribute_timer_process, e, (10), &e->t_distribute); @@ -267,11 +264,8 @@ void eigrp_distribute_update(struct distribute_ctx *ctx, #endif // TODO: check Graceful restart after 10sec - /* check if there is already GR scheduled */ - if (ei->t_distribute != NULL) { - /* if is, cancel schedule */ - thread_cancel(ei->t_distribute); - } + /* Cancel GR scheduled */ + thread_cancel(&(ei->t_distribute)); /* schedule Graceful restart for interface in 10sec */ e->t_distribute = NULL; thread_add_timer(master, eigrp_distribute_timer_interface, ei, 10, diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c index 2f3f34742..e7c6b2e07 100644 --- a/eigrpd/eigrp_interface.c +++ b/eigrpd/eigrp_interface.c @@ -358,7 +358,7 @@ void eigrp_if_stream_unset(struct eigrp_interface *ei) if (ei->on_write_q) { listnode_delete(eigrp->oi_write_q, ei); if (list_isempty(eigrp->oi_write_q)) - thread_cancel(eigrp->t_write); + thread_cancel(&(eigrp->t_write)); ei->on_write_q = 0; } } diff --git a/isisd/fabricd.c b/isisd/fabricd.c index 1a081bbea..57e9e91c1 100644 --- a/isisd/fabricd.c +++ b/isisd/fabricd.c @@ -239,14 +239,11 @@ struct fabricd *fabricd_new(struct isis_area *area) void fabricd_finish(struct fabricd *f) { - if (f->initial_sync_timeout) - thread_cancel(f->initial_sync_timeout); + thread_cancel(&(f->initial_sync_timeout)); - if (f->tier_calculation_timer) - thread_cancel(f->tier_calculation_timer); + thread_cancel(&(f->tier_calculation_timer)); - if (f->tier_set_timer) - thread_cancel(f->tier_set_timer); + thread_cancel(&(f->tier_set_timer)); isis_spftree_del(f->spftree); neighbor_lists_clear(f); @@ -340,8 +337,7 @@ void fabricd_initial_sync_finish(struct isis_area *area) f->initial_sync_circuit->interface->name); f->initial_sync_state = FABRICD_SYNC_COMPLETE; f->initial_sync_circuit = NULL; - thread_cancel(f->initial_sync_timeout); - f->initial_sync_timeout = NULL; + thread_cancel(&(f->initial_sync_timeout)); } static void fabricd_bump_tier_calculation_timer(struct fabricd *f); @@ -437,22 +433,15 @@ static int fabricd_tier_calculation_cb(struct thread *thread) static void fabricd_bump_tier_calculation_timer(struct fabricd *f) { /* Cancel timer if we already know our tier */ - if (f->tier != ISIS_TIER_UNDEFINED - || f->tier_set_timer) { - if (f->tier_calculation_timer) { - thread_cancel(f->tier_calculation_timer); - f->tier_calculation_timer = NULL; - } + if (f->tier != ISIS_TIER_UNDEFINED || f->tier_set_timer) { + thread_cancel(&(f->tier_calculation_timer)); return; } /* If we need to calculate the tier, wait some * time for the topology to settle before running * the calculation */ - if (f->tier_calculation_timer) { - thread_cancel(f->tier_calculation_timer); - f->tier_calculation_timer = NULL; - } + thread_cancel(&(f->tier_calculation_timer)); thread_add_timer(master, fabricd_tier_calculation_cb, f, 2 * f->area->lsp_gen_interval[ISIS_LEVEL2 - 1], @@ -737,7 +726,7 @@ void fabricd_trigger_csnp(struct isis_area *area, bool circuit_scoped) if (!circuit->t_send_csnp[1]) continue; - thread_cancel(circuit->t_send_csnp[ISIS_LEVEL2 - 1]); + thread_cancel(&(circuit->t_send_csnp[ISIS_LEVEL2 - 1])); thread_add_timer_msec(master, send_l2_csnp, circuit, isis_jitter(f->csnp_delay, CSNP_JITTER), &circuit->t_send_csnp[ISIS_LEVEL2 - 1]); diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index d6f257117..63be8841c 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -1987,7 +1987,7 @@ static void _send_hello_sched(struct isis_circuit *circuit, if (thread_timer_remain_msec(*threadp) < (unsigned long)delay) return; - thread_cancel(*threadp); + thread_cancel(threadp); } thread_add_timer_msec(master, send_hello_cb, diff --git a/isisd/isis_tx_queue.c b/isisd/isis_tx_queue.c index 1424b55bd..5c87e3915 100644 --- a/isisd/isis_tx_queue.c +++ b/isisd/isis_tx_queue.c @@ -93,8 +93,7 @@ static void tx_queue_element_free(void *element) { struct isis_tx_queue_entry *e = element; - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); XFREE(MTYPE_TX_QUEUE_ENTRY, e); } @@ -166,8 +165,7 @@ void _isis_tx_queue_add(struct isis_tx_queue *queue, e->type = type; - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); thread_add_event(master, tx_queue_send_event, e, 0, &e->retry); e->is_retry = false; @@ -190,8 +188,7 @@ void _isis_tx_queue_del(struct isis_tx_queue *queue, struct isis_lsp *lsp, func, file, line); } - if (e->retry) - thread_cancel(e->retry); + thread_cancel(&(e->retry)); hash_release(queue->hash, e); XFREE(MTYPE_TX_QUEUE_ENTRY, e); diff --git a/lib/agentx.c b/lib/agentx.c index 7c4bdcbe2..07f146bae 100644 --- a/lib/agentx.c +++ b/lib/agentx.c @@ -130,7 +130,7 @@ static void agentx_events_update(void) if (thr_fd == fd) { struct listnode *nextln = listnextnode(ln); if (!FD_ISSET(fd, &fds)) { - thread_cancel(thr); + thread_cancel(&thr); list_delete_node(events, ln); } ln = nextln; @@ -151,7 +151,8 @@ static void agentx_events_update(void) */ while (ln) { struct listnode *nextln = listnextnode(ln); - thread_cancel(listgetdata(ln)); + thr = listgetdata(ln); + thread_cancel(&thr); list_delete_node(events, ln); ln = nextln; } diff --git a/lib/frr_zmq.c b/lib/frr_zmq.c index 565936a41..cc11d7670 100644 --- a/lib/frr_zmq.c +++ b/lib/frr_zmq.c @@ -190,10 +190,8 @@ int funcname_frrzmq_thread_add_read(struct thread_master *master, cb->read.cancelled = false; if (events & ZMQ_POLLIN) { - if (cb->read.thread) { - thread_cancel(cb->read.thread); - cb->read.thread = NULL; - } + thread_cancel(&cb->read.thread); + funcname_thread_add_event(master, frrzmq_read_msg, cbp, fd, &cb->read.thread, funcname, schedfrom, fromln); @@ -298,10 +296,8 @@ int funcname_frrzmq_thread_add_write(struct thread_master *master, cb->write.cancelled = false; if (events & ZMQ_POLLOUT) { - if (cb->write.thread) { - thread_cancel(cb->write.thread); - cb->write.thread = NULL; - } + thread_cancel(&cb->write.thread); + funcname_thread_add_event(master, frrzmq_write_msg, cbp, fd, &cb->write.thread, funcname, schedfrom, fromln); @@ -317,10 +313,8 @@ void frrzmq_thread_cancel(struct frrzmq_cb **cb, struct cb_core *core) if (!cb || !*cb) return; core->cancelled = true; - if (core->thread) { - thread_cancel(core->thread); - core->thread = NULL; - } + thread_cancel(&core->thread); + if ((*cb)->read.cancelled && !(*cb)->read.thread && (*cb)->write.cancelled && (*cb)->write.thread) XFREE(MTYPE_ZEROMQ_CB, *cb); @@ -344,8 +338,8 @@ void frrzmq_check_events(struct frrzmq_cb **cbp, struct cb_core *core, return; if (events & event && core->thread && !core->cancelled) { struct thread_master *tm = core->thread->master; - thread_cancel(core->thread); - core->thread = NULL; + thread_cancel(&core->thread); + thread_add_event(tm, (event == ZMQ_POLLIN ? frrzmq_read_msg : frrzmq_write_msg), cbp, cb->fd, &core->thread); diff --git a/lib/thread.c b/lib/thread.c index db35a3f03..90c6c6f0a 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -1163,19 +1163,26 @@ void thread_cancel_event(struct thread_master *master, void *arg) * * @param thread task to cancel */ -void thread_cancel(struct thread *thread) +void thread_cancel(struct thread **thread) { - struct thread_master *master = thread->master; + struct thread_master *master; + + if (thread == NULL || *thread == NULL) + return; + + master = (*thread)->master; assert(master->owner == pthread_self()); frr_with_mutex(&master->mtx) { struct cancel_req *cr = XCALLOC(MTYPE_TMP, sizeof(struct cancel_req)); - cr->thread = thread; + cr->thread = *thread; listnode_add(master->cancel_req, cr); do_thread_cancel(master); } + + *thread = NULL; } /** diff --git a/lib/thread.h b/lib/thread.h index c22b2105c..a581796d3 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -89,6 +89,8 @@ struct thread_master { pthread_t owner; }; +typedef struct thread_master event_master; + /* Thread itself. */ struct thread { uint8_t type; /* thread type */ @@ -147,17 +149,10 @@ struct cpu_thread_history { #define THREAD_FD(X) ((X)->u.fd) #define THREAD_VAL(X) ((X)->u.val) -#define THREAD_OFF(thread) \ - do { \ - if (thread) { \ - thread_cancel(thread); \ - thread = NULL; \ - } \ - } while (0) - -#define THREAD_READ_OFF(thread) THREAD_OFF(thread) -#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread) -#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread) +#define THREAD_OFF(thread) thread_cancel(&(thread)) +#define THREAD_READ_OFF(thread) thread_cancel(&(thread)) +#define THREAD_WRITE_OFF(thread) thread_cancel(&(thread)) +#define THREAD_TIMER_OFF(thread) thread_cancel(&(thread)) #define debugargdef const char *funcname, const char *schedfrom, int fromln @@ -207,7 +202,7 @@ extern void funcname_thread_execute(struct thread_master *, debugargdef); #undef debugargdef -extern void thread_cancel(struct thread *); +extern void thread_cancel(struct thread **event); extern void thread_cancel_async(struct thread_master *, struct thread **, void *); extern void thread_cancel_event(struct thread_master *, void *); diff --git a/lib/workqueue.c b/lib/workqueue.c index 54090d0d0..f8e467722 100644 --- a/lib/workqueue.c +++ b/lib/workqueue.c @@ -104,7 +104,7 @@ void work_queue_free_and_null(struct work_queue **wqp) struct work_queue *wq = *wqp; if (wq->thread != NULL) - thread_cancel(wq->thread); + thread_cancel(&(wq->thread)); while (!work_queue_empty(wq)) { struct work_queue_item *item = work_queue_last_item(wq); @@ -215,7 +215,7 @@ void workqueue_cmd_init(void) void work_queue_plug(struct work_queue *wq) { if (wq->thread) - thread_cancel(wq->thread); + thread_cancel(&(wq->thread)); wq->thread = NULL; diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c index 9d3493e91..c01ecdd1d 100644 --- a/ospfd/ospf_apiserver.c +++ b/ospfd/ospf_apiserver.c @@ -317,21 +317,12 @@ void ospf_apiserver_free(struct ospf_apiserver *apiserv) struct listnode *node; /* Cancel read and write threads. */ - if (apiserv->t_sync_read) { - thread_cancel(apiserv->t_sync_read); - } + thread_cancel(&apiserv->t_sync_read); #ifdef USE_ASYNC_READ - if (apiserv->t_async_read) { - thread_cancel(apiserv->t_async_read); - } + thread_cancel(&apiserv->t_async_read); #endif /* USE_ASYNC_READ */ - if (apiserv->t_sync_write) { - thread_cancel(apiserv->t_sync_write); - } - - if (apiserv->t_async_write) { - thread_cancel(apiserv->t_async_write); - } + thread_cancel(&apiserv->t_sync_write); + thread_cancel(&apiserv->t_async_write); /* Unregister all opaque types that application registered and flush opaque LSAs if still in LSDB. */ diff --git a/ospfd/ospf_ism.h b/ospfd/ospf_ism.h index 67ea4c468..6c0df9a1e 100644 --- a/ospfd/ospf_ism.h +++ b/ospfd/ospf_ism.h @@ -79,13 +79,7 @@ } while (0) /* Macro for OSPF ISM timer turn off. */ -#define OSPF_ISM_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_ISM_TIMER_OFF(X) thread_cancel(&(X)); /* Macro for OSPF schedule event. */ #define OSPF_ISM_EVENT_SCHEDULE(I, E) \ diff --git a/ospfd/ospf_nsm.h b/ospfd/ospf_nsm.h index c219ba738..24cf05009 100644 --- a/ospfd/ospf_nsm.h +++ b/ospfd/ospf_nsm.h @@ -59,13 +59,7 @@ #define OSPF_NSM_TIMER_ON(T,F,V) thread_add_timer (master, (F), nbr, (V), &(T)) /* Macro for OSPF NSM timer turn off. */ -#define OSPF_NSM_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_NSM_TIMER_OFF(X) thread_cancel(&(X)) /* Macro for OSPF NSM schedule event. */ #define OSPF_NSM_EVENT_SCHEDULE(N, E) \ diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 8cb0062ea..ef39b6c2f 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -468,11 +468,7 @@ static int ospf_ls_req_timer(struct thread *thread) void ospf_ls_req_event(struct ospf_neighbor *nbr) { - if (nbr->t_ls_req) { - thread_cancel(nbr->t_ls_req); - nbr->t_ls_req = NULL; - } - nbr->t_ls_req = NULL; + thread_cancel(&nbr->t_ls_req); thread_add_event(master, ospf_ls_req_timer, nbr, 0, &nbr->t_ls_req); } diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index ce3bc33c1..3718f82c0 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -1324,10 +1324,7 @@ void ospf_ls_upd_queue_empty(struct ospf_interface *oi) } /* remove update event */ - if (oi->t_ls_upd_event) { - thread_cancel(oi->t_ls_upd_event); - oi->t_ls_upd_event = NULL; - } + thread_cancel(&oi->t_ls_upd_event); } void ospf_if_update(struct ospf *ospf, struct interface *ifp) @@ -2158,7 +2155,7 @@ static int ospf_vrf_disable(struct vrf *vrf) if (IS_DEBUG_OSPF_EVENT) zlog_debug("%s: ospf old_vrf_id %d unlinked", __func__, old_vrf_id); - thread_cancel(ospf->t_read); + thread_cancel(&ospf->t_read); close(ospf->fd); ospf->fd = -1; } diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h index 5009355d4..5535cb40a 100644 --- a/ospfd/ospfd.h +++ b/ospfd/ospfd.h @@ -535,13 +535,7 @@ struct ospf_nbr_nbma { #define OSPF_AREA_TIMER_ON(T,F,V) thread_add_timer (master, (F), area, (V), &(T)) #define OSPF_POLL_TIMER_ON(T,F,V) thread_add_timer (master, (F), nbr_nbma, (V), &(T)) #define OSPF_POLL_TIMER_OFF(X) OSPF_TIMER_OFF((X)) -#define OSPF_TIMER_OFF(X) \ - do { \ - if (X) { \ - thread_cancel(X); \ - (X) = NULL; \ - } \ - } while (0) +#define OSPF_TIMER_OFF(X) thread_cancel(&(X)) /* Extern variables. */ extern struct ospf_master *om; diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index c2cee4d69..c601ab404 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -468,10 +468,7 @@ static void rip_interface_clean(struct rip_interface *ri) ri->enable_interface = 0; ri->running = 0; - if (ri->t_wakeup) { - thread_cancel(ri->t_wakeup); - ri->t_wakeup = NULL; - } + thread_cancel(&ri->t_wakeup); } void rip_interfaces_clean(struct rip *rip) diff --git a/ripd/rip_peer.c b/ripd/rip_peer.c index 4c5233c82..23599f087 100644 --- a/ripd/rip_peer.c +++ b/ripd/rip_peer.c @@ -86,8 +86,7 @@ static struct rip_peer *rip_peer_get(struct rip *rip, struct in_addr *addr) peer = rip_peer_lookup(rip, addr); if (peer) { - if (peer->t_timeout) - thread_cancel(peer->t_timeout); + thread_cancel(&peer->t_timeout); } else { peer = rip_peer_new(); peer->rip = rip; diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c index 16859c2d2..115d7a6b9 100644 --- a/ripngd/ripng_interface.c +++ b/ripngd/ripng_interface.c @@ -321,10 +321,7 @@ void ripng_interface_clean(struct ripng *ripng) ri->enable_interface = 0; ri->running = 0; - if (ri->t_wakeup) { - thread_cancel(ri->t_wakeup); - ri->t_wakeup = NULL; - } + thread_cancel(&ri->t_wakeup); } } diff --git a/ripngd/ripng_peer.c b/ripngd/ripng_peer.c index e6ff58dd0..0ac489c67 100644 --- a/ripngd/ripng_peer.c +++ b/ripngd/ripng_peer.c @@ -95,8 +95,7 @@ static struct ripng_peer *ripng_peer_get(struct ripng *ripng, peer = ripng_peer_lookup(ripng, addr); if (peer) { - if (peer->t_timeout) - thread_cancel(peer->t_timeout); + thread_cancel(&peer->t_timeout); } else { peer = ripng_peer_new(); peer->ripng = ripng; @@ -105,7 +104,6 @@ static struct ripng_peer *ripng_peer_get(struct ripng *ripng, } /* Update timeout thread. */ - peer->t_timeout = NULL; thread_add_timer(master, ripng_peer_timeout, peer, RIPNG_PEER_TIMER_DEFAULT, &peer->t_timeout); diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c index 060477010..8d9249e4a 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -1463,10 +1463,7 @@ static int ripng_update(struct thread *t) /* Triggered updates may be suppressed if a regular update is due by the time the triggered update would be sent. */ - if (ripng->t_triggered_interval) { - thread_cancel(ripng->t_triggered_interval); - ripng->t_triggered_interval = NULL; - } + thread_cancel(&ripng->t_triggered_interval); ripng->trigger = 0; /* Reset flush event. */ @@ -1500,10 +1497,7 @@ int ripng_triggered_update(struct thread *t) ripng->t_triggered_update = NULL; /* Cancel interval timer. */ - if (ripng->t_triggered_interval) { - thread_cancel(ripng->t_triggered_interval); - ripng->t_triggered_interval = NULL; - } + thread_cancel(&ripng->t_triggered_interval); ripng->trigger = 0; /* Logging triggered update. */ @@ -1952,10 +1946,8 @@ void ripng_event(struct ripng *ripng, enum ripng_event event, int sock) &ripng->t_read); break; case RIPNG_UPDATE_EVENT: - if (ripng->t_update) { - thread_cancel(ripng->t_update); - ripng->t_update = NULL; - } + thread_cancel(&ripng->t_update); + /* Update timer jitter. */ jitter = ripng_update_jitter(ripng->update_time); @@ -2719,10 +2711,7 @@ static void ripng_instance_disable(struct ripng *ripng) RIPNG_TIMER_OFF(ripng->t_triggered_interval); /* Cancel the read thread */ - if (ripng->t_read) { - thread_cancel(ripng->t_read); - ripng->t_read = NULL; - } + thread_cancel(&ripng->t_read); /* Close the RIPng socket */ if (ripng->sock >= 0) { diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h index 70508d5cb..97291829b 100644 --- a/ripngd/ripngd.h +++ b/ripngd/ripngd.h @@ -351,13 +351,7 @@ enum ripng_event { /* RIPng timer on/off macro. */ #define RIPNG_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T)) -#define RIPNG_TIMER_OFF(T) \ - do { \ - if (T) { \ - thread_cancel(T); \ - (T) = NULL; \ - } \ - } while (0) +#define RIPNG_TIMER_OFF(T) thread_cancel(&(T)); #define RIPNG_OFFSET_LIST_IN 0 #define RIPNG_OFFSET_LIST_OUT 1 diff --git a/tests/lib/test_timer_correctness.c b/tests/lib/test_timer_correctness.c index cbf9b0554..416ea3977 100644 --- a/tests/lib/test_timer_correctness.c +++ b/tests/lib/test_timer_correctness.c @@ -153,7 +153,7 @@ int main(int argc, char **argv) continue; XFREE(MTYPE_TMP, timers[index]->arg); - thread_cancel(timers[index]); + thread_cancel(&timers[index]); timers[index] = NULL; timers_pending--; } diff --git a/tests/lib/test_timer_performance.c b/tests/lib/test_timer_performance.c index 2960e0d81..45b29b92b 100644 --- a/tests/lib/test_timer_performance.c +++ b/tests/lib/test_timer_performance.c @@ -59,7 +59,7 @@ int main(int argc, char **argv) thread_add_timer_msec(master, dummy_func, NULL, 0, &timers[i]); } for (i = 0; i < SCHEDULE_TIMERS; i++) - thread_cancel(timers[i]); + thread_cancel(&timers[i]); monotime(&tv_start); @@ -78,8 +78,7 @@ int main(int argc, char **argv) int index; index = prng_rand(prng) % SCHEDULE_TIMERS; - if (timers[index]) - thread_cancel(timers[index]); + thread_cancel(&timers[index]); timers[index] = NULL; } diff --git a/watchfrr/watchfrr.c b/watchfrr/watchfrr.c index af243f7ca..cd5ec6725 100644 --- a/watchfrr/watchfrr.c +++ b/watchfrr/watchfrr.c @@ -409,8 +409,8 @@ static void sigchild(void) what = restart->what; restart->pid = 0; gs.numpids--; - thread_cancel(restart->t_kill); - restart->t_kill = NULL; + thread_cancel(&restart->t_kill); + /* Update restart time to reflect the time the command * completed. */ gettimeofday(&restart->time, NULL); @@ -678,8 +678,7 @@ static int handle_read(struct thread *t_read) dmn->name, (long)delay.tv_sec, (long)delay.tv_usec); SET_READ_HANDLER(dmn); - if (dmn->t_wakeup) - thread_cancel(dmn->t_wakeup); + thread_cancel(&dmn->t_wakeup); SET_WAKEUP_ECHO(dmn); return 0; @@ -866,9 +865,8 @@ static int phase_hanging(struct thread *t_hanging) static void set_phase(restart_phase_t new_phase) { gs.phase = new_phase; - if (gs.t_phase_hanging) - thread_cancel(gs.t_phase_hanging); - gs.t_phase_hanging = NULL; + thread_cancel(&gs.t_phase_hanging); + thread_add_timer(master, phase_hanging, NULL, PHASE_TIMEOUT, &gs.t_phase_hanging); } diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c index 710a32c45..936206641 100644 --- a/zebra/irdp_main.c +++ b/zebra/irdp_main.c @@ -263,9 +263,7 @@ void irdp_advert_off(struct interface *ifp) if (!irdp) return; - if (irdp->t_advertise) - thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; + thread_cancel(&irdp->t_advertise); if (ifp->connected) for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, ifc)) { @@ -300,9 +298,7 @@ void process_solicit(struct interface *ifp) return; irdp->flags |= IF_SOLICIT; - if (irdp->t_advertise) - thread_cancel(irdp->t_advertise); - irdp->t_advertise = NULL; + thread_cancel(&irdp->t_advertise); timer = (frr_weak_random() % MAX_RESPONSE_DELAY) + 1; diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c index 995fa6fb5..ee2dc7a0e 100644 --- a/zebra/zebra_netns_notify.c +++ b/zebra/zebra_netns_notify.c @@ -378,7 +378,7 @@ void zebra_ns_notify_close(void) fd = zebra_netns_notify_current->u.fd; if (zebra_netns_notify_current->master != NULL) - thread_cancel(zebra_netns_notify_current); + thread_cancel(&zebra_netns_notify_current); /* auto-removal of notify items */ if (fd > 0) diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index 9a3b567b5..013cb6449 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -156,13 +156,10 @@ void zebra_ptm_finish(void) if (ptm_cb.in_data) free(ptm_cb.in_data); - /* Release threads. */ - if (ptm_cb.t_read) - thread_cancel(ptm_cb.t_read); - if (ptm_cb.t_write) - thread_cancel(ptm_cb.t_write); - if (ptm_cb.t_timer) - thread_cancel(ptm_cb.t_timer); + /* Cancel events. */ + thread_cancel(&ptm_cb.t_read); + thread_cancel(&ptm_cb.t_write); + thread_cancel(&ptm_cb.t_timer); if (ptm_cb.wb) buffer_free(ptm_cb.wb); diff --git a/zebra/zebra_routemap.c b/zebra/zebra_routemap.c index 8155f9acf..cf8cd0639 100644 --- a/zebra/zebra_routemap.c +++ b/zebra/zebra_routemap.c @@ -1695,7 +1695,7 @@ static void zebra_route_map_set_delay_timer(uint32_t value) if (!value && zebra_t_rmap_update) { /* Event driven route map updates is being disabled */ /* But there's a pending timer. Fire it off now */ - thread_cancel(zebra_t_rmap_update); + thread_cancel(&zebra_t_rmap_update); zebra_route_map_update_timer(zebra_t_rmap_update); } } |