From 2cb6fca127cb641c0fa23ec326dc9f3ebfb08044 Mon Sep 17 00:00:00 2001 From: Youri Hubaut Date: Sat, 16 May 2015 13:28:28 +0200 Subject: [PATCH] Seems more correct Former-commit-id: fa83f37d65c97bd5bfb7840865fab0e838804c30 --- src/Nazara/Core/Posix/TaskSchedulerImpl.cpp | 37 +++++++-------------- src/Nazara/Core/Posix/TaskSchedulerImpl.hpp | 1 - 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/Nazara/Core/Posix/TaskSchedulerImpl.cpp b/src/Nazara/Core/Posix/TaskSchedulerImpl.cpp index 72d4b781b..e672b0c20 100644 --- a/src/Nazara/Core/Posix/TaskSchedulerImpl.cpp +++ b/src/Nazara/Core/Posix/TaskSchedulerImpl.cpp @@ -76,17 +76,14 @@ void NzTaskSchedulerImpl::Uninitialize() } #endif + // On réveille les threads pour qu'ils sortent de la boucle et terminent. + pthread_mutex_lock(&s_mutexQueue); // On commence par vider la queue et demander qu'ils s'arrêtent. + std::queue emptyQueue; + std::swap(s_tasks, emptyQueue); s_shouldFinish = true; - - ClearQueue(); - - { - // On réveille les threads pour qu'ils sortent de la boucle et terminent. - pthread_mutex_lock(&s_mutexQueue); - pthread_cond_broadcast(&s_cvNotEmpty); - pthread_mutex_unlock(&s_mutexQueue); - } + pthread_cond_broadcast(&s_cvNotEmpty); + pthread_mutex_unlock(&s_mutexQueue); // On attend que chaque thread se termine for (unsigned int i = 0; i < s_workerCount; ++i) @@ -114,14 +111,6 @@ void NzTaskSchedulerImpl::WaitForTasks() Wait(); } -void NzTaskSchedulerImpl::ClearQueue() -{ - pthread_mutex_lock(&s_mutexQueue); - std::queue emptyQueue; - std::swap(s_tasks, emptyQueue); - pthread_mutex_unlock(&s_mutexQueue); -} - NzFunctor* NzTaskSchedulerImpl::PopQueue() { NzFunctor* task = nullptr; @@ -144,14 +133,12 @@ void NzTaskSchedulerImpl::Wait() if (s_isDone) return; - if (!s_isDone) - { - s_isWaiting = true; - pthread_mutex_lock(&s_mutexQueue); - pthread_cond_broadcast(&s_cvNotEmpty); - pthread_cond_wait(&s_cvEmpty, &s_mutexQueue); - pthread_mutex_unlock(&s_mutexQueue); - } + pthread_mutex_lock(&s_mutexQueue); + s_isWaiting = true; + pthread_cond_broadcast(&s_cvNotEmpty); + pthread_cond_wait(&s_cvEmpty, &s_mutexQueue); + pthread_mutex_unlock(&s_mutexQueue); + s_isDone = true; } diff --git a/src/Nazara/Core/Posix/TaskSchedulerImpl.hpp b/src/Nazara/Core/Posix/TaskSchedulerImpl.hpp index f8715754b..632e65370 100644 --- a/src/Nazara/Core/Posix/TaskSchedulerImpl.hpp +++ b/src/Nazara/Core/Posix/TaskSchedulerImpl.hpp @@ -27,7 +27,6 @@ class NzTaskSchedulerImpl static void WaitForTasks(); private: - static void ClearQueue(); static NzFunctor* PopQueue(); static void Wait(); static void* WorkerProc(void* userdata);