diff --git a/src/common/threads.cpp b/src/common/threads.cpp index 7a034a76..2fa2fc7c 100644 --- a/src/common/threads.cpp +++ b/src/common/threads.cpp @@ -8,7 +8,6 @@ #include // IWYU pragma: keep #include // IWYU pragma: keep #include -#include #if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS && KYTY_COMPILER == KYTY_COMPILER_CLANG #define KYTY_WIN_CS @@ -197,37 +196,7 @@ struct CondVarPrivate { #endif }; -static std::recursive_mutex g_cond_waiters_mutex; -static std::vector> g_cond_waiters; -static wait_poll_func_t g_cond_wait_poll_callback = nullptr; - -static void WakeCondVar(CondVarPrivate* cond_var) { -#ifdef KYTY_WIN_CS - static auto func = ResolveWakeAllConditionVariable(); - EXIT_NOT_IMPLEMENTED(func == nullptr); - func(&cond_var->m_cv); -#else - cond_var->m_cv.notify_all(); -#endif -} - -static void RegisterCondWaiter(CondVarPrivate* cond_var) { - std::lock_guard lock(g_cond_waiters_mutex); - g_cond_waiters.emplace_back(Thread::GetThreadIdUnique(), cond_var); -} - -static void UnregisterCondWaiter(CondVarPrivate* cond_var) { - const auto thread_id = Thread::GetThreadIdUnique(); - std::lock_guard lock(g_cond_waiters_mutex); - - const auto it = std::find_if(g_cond_waiters.begin(), g_cond_waiters.end(), - [thread_id, cond_var](const auto& waiter) { - return waiter.first == thread_id && waiter.second == cond_var; - }); - if (it != g_cond_waiters.end()) { - g_cond_waiters.erase(it); - } -} +static wait_poll_func_t g_cond_wait_poll_callback = nullptr; struct ThreadPrivate { ThreadPrivate(thread_func_t f, void* a): func(f), arg(a), m_thread(&Run, this) {} @@ -365,7 +334,6 @@ CondVar::~CondVar() { } void CondVar::Wait(Mutex* mutex) { - RegisterCondWaiter(m_cond_var.get()); #ifndef KYTY_WIN_CS std::unique_lock cpp_lock(mutex->m_mutex->m_mutex, std::adopt_lock_t()); #endif @@ -406,7 +374,6 @@ void CondVar::Wait(Mutex* mutex) { } cpp_lock.release(); #endif - UnregisterCondWaiter(m_cond_var.get()); } void CondVar::SetWaitPollCallback(wait_poll_func_t callback) { @@ -415,7 +382,6 @@ void CondVar::SetWaitPollCallback(wait_poll_func_t callback) { bool CondVar::WaitFor(Mutex* mutex, uint32_t micros) { bool ok = false; - RegisterCondWaiter(m_cond_var.get()); #ifndef KYTY_WIN_CS std::unique_lock cpp_lock(mutex->m_mutex->m_mutex, std::adopt_lock_t()); #endif @@ -430,7 +396,6 @@ bool CondVar::WaitFor(Mutex* mutex, uint32_t micros) { std::cv_status::no_timeout); cpp_lock.release(); #endif - UnregisterCondWaiter(m_cond_var.get()); return ok; } @@ -445,16 +410,13 @@ void CondVar::Signal() { } void CondVar::SignalAll() { - WakeCondVar(m_cond_var.get()); -} - -void CondVar::SignalThread(int thread_id) { - std::lock_guard lock(g_cond_waiters_mutex); - for (const auto& waiter: g_cond_waiters) { - if (waiter.first == thread_id) { - WakeCondVar(waiter.second); - } - } +#ifdef KYTY_WIN_CS + static auto func = ResolveWakeAllConditionVariable(); + EXIT_NOT_IMPLEMENTED(func == nullptr); + func(&m_cond_var->m_cv); +#else + m_cond_var->m_cv.notify_all(); +#endif } int Thread::GetThreadIdUnique() { diff --git a/src/common/threads.h b/src/common/threads.h index f9c6f983..d37aa144 100644 --- a/src/common/threads.h +++ b/src/common/threads.h @@ -77,7 +77,6 @@ public: void Signal(); void SignalAll(); - static void SignalThread(int thread_id); static void SetWaitPollCallback(wait_poll_func_t callback); KYTY_CLASS_NO_COPY(CondVar); diff --git a/src/kernel/pthread.cpp b/src/kernel/pthread.cpp index 3c6dc2f2..ea0206d4 100644 --- a/src/kernel/pthread.cpp +++ b/src/kernel/pthread.cpp @@ -3093,10 +3093,6 @@ Pthread PthreadSwapSelfForSignal(Pthread thread) { return previous; } -int PthreadGetUniqueId(Pthread thread) { - return thread != nullptr ? thread->unique_id : 0; -} - uint64_t PthreadGetHostThreadId(Pthread thread) { return thread != nullptr ? thread->host_thread_id : 0; } diff --git a/src/kernel/pthread.h b/src/kernel/pthread.h index 24a83a9e..21bbe970 100644 --- a/src/kernel/pthread.h +++ b/src/kernel/pthread.h @@ -110,7 +110,6 @@ int KYTY_SYSV_ABI PthreadRename(Pthread thread, const char* name); void KYTY_SYSV_ABI PthreadYield(); int KYTY_SYSV_ABI PthreadGetthreadid(); int KYTY_SYSV_ABI PthreadGetaffinity(Pthread thread, KernelCpumask* mask); -int PthreadGetUniqueId(Pthread thread); uint64_t PthreadGetHostThreadId(Pthread thread); void PthreadWakeForSignal(Pthread thread); void PthreadQueuePendingSignal(Pthread thread, int signum); diff --git a/src/libs/libKernel.cpp b/src/libs/libKernel.cpp index f52033f0..57b75009 100644 --- a/src/libs/libKernel.cpp +++ b/src/libs/libKernel.cpp @@ -1168,7 +1168,6 @@ static int KYTY_SYSV_ABI KernelRaiseException(Pthread thread, int signum) { return KERNEL_ERROR_EINVAL; } - Common::CondVar::SignalThread(PthreadGetUniqueId(thread)); PthreadWakeForSignal(thread); CloseHandle(target_thread); return OK; @@ -1193,7 +1192,6 @@ static int KYTY_SYSV_ABI KernelRaiseException(Pthread thread, int signum) { return KERNEL_ERROR_EINVAL; } - Common::CondVar::SignalThread(PthreadGetUniqueId(thread)); PthreadWakeForSignal(thread); WaitForSignalDispatch(thread, signum); return OK;