From 71e459eea31e9e47c0ce64a78e32b242d357f9a0 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sat, 7 Dec 2024 11:44:22 -0800 Subject: fini: add drain mechanism for aio, reap, and task subsystems Make sure *everything* is drained before proceeding all the way to deallocation. --- src/core/init.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/core/init.c') diff --git a/src/core/init.c b/src/core/init.c index fa07919e..4b31995a 100644 --- a/src/core/init.c +++ b/src/core/init.c @@ -133,13 +133,18 @@ nng_fini(void) nni_atomic_flag_reset(&init_busy); return; } - nni_aio_sys_stop(); // no more scheduling allowed! nni_sock_closeall(); nni_sp_tran_sys_fini(); + + // Drain everything. This is important because some of + // these subsystems can dispatch things to other ones. + // So we need them *all* to be empty before proceeding. + while ((nni_aio_sys_drain() || nni_taskq_sys_drain() || + nni_reap_sys_drain())) { + continue; + } nni_tls_sys_fini(); - nni_reap_drain(); nni_taskq_sys_fini(); - nni_reap_drain(); nni_aio_sys_fini(); nni_id_map_sys_fini(); nni_reap_sys_fini(); // must be near the end -- cgit v1.2.3-70-g09d2