diff --git a/matrix/homeserver.cc b/matrix/homeserver.cc index 71b63d638..b73eb9cc0 100644 --- a/matrix/homeserver.cc +++ b/matrix/homeserver.cc @@ -161,6 +161,15 @@ ircd::m::origin(const homeserver &homeserver) // homeserver::homeserver // +/// --- tmp --- + +namespace ircd::m +{ + std::unique_ptr _fetch; +} + +/// --- /tmp --- + decltype(ircd::m::homeserver::primary) ircd::m::homeserver::primary; @@ -172,6 +181,11 @@ try assert(opts); rfc3986::valid_host(opts->origin); rfc3986::valid_host(opts->server_name); + + //TODO: XXX + if(!_fetch) + _fetch = std::make_unique(); + return new homeserver { opts @@ -262,14 +276,30 @@ ircd::m::homeserver::~homeserver() noexcept { if(primary == this) - m::init::backfill::fini(); - - signoff(*this); - vm.reset(); + { + //TODO: remove this for non-interfering shutdown + server::init::interrupt(); + client::terminate_all(); + server::init::close(); + client::close_all(); + client::wait_all(); + server::init::wait(); + } + if(primary == this) + { + m::init::backfill::fini(); + m::sync::pool.join(); + } + + signoff(*this); if(primary == this) mods::imports.erase("net_dns_cache"s); + vm.reset(); + if(primary == this) + _fetch.reset(nullptr); + while(!modules.empty()) modules.pop_back(); } diff --git a/matrix/matrix.cc b/matrix/matrix.cc index a6322fef8..05bc164b9 100644 --- a/matrix/matrix.cc +++ b/matrix/matrix.cc @@ -163,27 +163,11 @@ ircd::m::matrix::module_names_optional // init // -/// --- tmp --- - -namespace ircd::m::init -{ - struct modules; -} - -namespace ircd::m -{ - std::unique_ptr _fetch; - //std::unique_ptr _modules; -} - -/// --- /tmp --- - void ircd::m::on_load() try { assert(ircd::run::level == run::level::IDLE); - _fetch = std::make_unique(); } catch(const m::error &e) { @@ -221,18 +205,7 @@ void ircd::m::on_unload() noexcept try { - if(m::sync::pool.size()) - m::sync::pool.join(); - _fetch.reset(nullptr); - - //TODO: remove this for non-interfering shutdown - //server::interrupt_all(); - //client::terminate_all(); - //client::close_all(); - //server::close_all(); - //server::wait_all(); - //client::wait_all(); } catch(const m::error &e) {