Restore thread counter (world may be not ready yet)

Remove dumb 1300ms timeout.
This commit is contained in:
Nekotekina 2020-02-25 11:43:04 +03:00
parent cd40bc8c61
commit 7eebe06931
4 changed files with 19 additions and 3 deletions

View File

@ -1722,6 +1722,8 @@ DECLARE(thread_ctrl::g_native_core_layout) { native_core_arrangement::undefined
void thread_base::start(native_entry entry)
{
thread_ctrl::g_thread_count++;
#ifdef _WIN32
m_thread = ::_beginthreadex(nullptr, 0, entry, this, CREATE_SUSPENDED, nullptr);
verify("thread_ctrl::start" HERE), m_thread, ::ResumeThread(reinterpret_cast<HANDLE>(+m_thread)) != -1;
@ -1863,6 +1865,7 @@ void thread_base::finalize() noexcept
{
g_tls_log_prefix = []() -> std::string { return {}; };
thread_ctrl::g_tls_this_thread = nullptr;
thread_ctrl::g_thread_count--;
}
void thread_ctrl::_wait_for(u64 usec, bool alert /* true */)

View File

@ -192,6 +192,9 @@ class thread_ctrl final
// Target cpu core layout
static atomic_t<native_core_arrangement> g_native_core_layout;
// Global thread counter
static inline atomic_t<u64> g_thread_count = 0;
// Internal waiting function, may throw. Infinite value is -1.
static void _wait_for(u64 usec, bool alert);
@ -275,6 +278,11 @@ public:
return g_tls_this_thread;
}
static u64 get_count()
{
return g_thread_count.load();
}
// Detect layout
static void detect_cpu_layout();

View File

@ -630,9 +630,6 @@ void cpu_thread::stop_all() noexcept
std::this_thread::sleep_for(10ms);
}
// Workaround for remaining threads (TODO)
std::this_thread::sleep_for(1300ms);
sys_log.notice("All CPU threads have been stopped.");
}

View File

@ -1600,6 +1600,14 @@ void Emulator::Stop(bool restart)
cpu_thread::stop_all();
g_fxo->reset();
while (thread_ctrl::get_count())
{
std::this_thread::sleep_for(10ms);
}
sys_log.notice("All threads have been stopped.");
lv2_obj::cleanup();
idm::clear();