void CleanUpEverything() { auto glbl = globalStruct::GetGlobals(); if (!glbl) return; auto svr = glbl->GetServer(); if (svr) { svr->Stop(); } auto strm = glbl->GetStreamer(); if (strm) { strm->stopStream(); } auto pipe = glbl->GetPipe(); if (pipe) { pipe->Cleanup(); } glbl->work_guard.reset(); auto svc = glbl->GetService(); glbl->ResetAllPointers(); svr.reset(); strm.reset(); pipe.reset(); if (svc && !svc->stopped()) { svc->stop(); } std::for_each(glbl->globalThreads.begin(), glbl->globalThreads.end(), [](decltype(*glbl->globalThreads.begin())& thr) { thr.join(); }); svc.reset(); auto trkr = glbl->GetTracker(); if (trkr) { trkr->WaitUntilThreadVecEmpty(); trkr.reset(); std::shared_ptr<FunctionUsageTracker> resetTracker; std::atomic_store(&glbl->fcnTracker, resetTracker); std::this_thread::sleep_for(std::chrono::seconds(10)); // Wait some time for threads to exit } glbl.reset(); globalStruct::nullifyGlobals(); }
/** \brief Get the system being tracked on, which is referred to by the tracker. */ inline const System& GetSystem() const { return GetTracker().GetSystem();}