diff options
Diffstat (limited to 'src/core/init.c')
| -rw-r--r-- | src/core/init.c | 11 |
1 files changed, 8 insertions, 3 deletions
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 |
