* lib/workqueue.c: free-ing workqueues had never been tested obviously,
queue's thread was not being stopped
* bgpd/bgpd.c: null out freed workqueues, to prevent acting on freed
workqueues
BGP_NOTIFY_CEASE_PEER_UNCONFIG);
bgp_cleanup_routes ();
+
if (bm->process_main_queue)
- work_queue_free (bm->process_main_queue);
+ {
+ work_queue_free (bm->process_main_queue);
+ bm->process_main_queue = NULL;
+ }
if (bm->process_rsclient_queue)
- work_queue_free (bm->process_rsclient_queue);
+ {
+ work_queue_free (bm->process_rsclient_queue);
+ bm->process_rsclient_queue = NULL;
+ }
}
-
void
work_queue_free (struct work_queue *wq)
{
+ if (wq->thread != NULL)
+ thread_cancel(wq->thread);
+
/* list_delete frees items via callback */
list_delete (wq->items);
listnode_delete (&work_queues, wq);