diff --git a/include/ircd/m/init.h b/include/ircd/m/init.h index 28651afb6..0e6311889 100644 --- a/include/ircd/m/init.h +++ b/include/ircd/m/init.h @@ -20,7 +20,10 @@ namespace ircd::m::init /// Internal use only; do not call namespace ircd::m::init::backfill { - void init(), fini() noexcept; + void + init(), + term() noexcept, + fini() noexcept; } /// Internal use only; do not call diff --git a/matrix/init_backfill.cc b/matrix/init_backfill.cc index 78a21b384..4f8231bb6 100644 --- a/matrix/init_backfill.cc +++ b/matrix/init_backfill.cc @@ -131,7 +131,7 @@ ircd::m::init::backfill::handle_quit { run::level::QUIT, [] { - fini(); + term(); } }; @@ -163,30 +163,60 @@ ircd::m::init::backfill::init() worker_context = context.detach(); } +void +ircd::m::init::backfill::term() +noexcept +{ + assert(!worker_pool || worker_context); + + if(worker_pool) + { + log::debug + { + log, "Terminating worker pool...", + }; + + worker_pool->terminate(); + } + + if(worker_context) + { + log::debug + { + log, "Terminating worker context...", + }; + + ctx::terminate(*worker_context); + } +} + void ircd::m::init::backfill::fini() noexcept { + term(); if(worker_context) - log::debug + log::dwarning { - log, "Terminating worker context..." + log, "Waiting for worker context...", }; - if(worker_pool) - worker_pool->terminate(); + while(worker_context) + ctx::sleep(333ms); - if(worker_context) - ctx::terminate(*worker_context); - - worker_context = nullptr; - worker_pool = nullptr; + assert(!worker_pool); + assert(!worker_context); } void ircd::m::init::backfill::worker() try { + const unwind nullify{[] + { + worker_context = nullptr; + }}; + // Wait for runlevel RUN before proceeding... run::barrier{};