diff --git a/src/Nazara/Core/TaskScheduler.cpp b/src/Nazara/Core/TaskScheduler.cpp index 1bae416c6..d1dc50c39 100644 --- a/src/Nazara/Core/TaskScheduler.cpp +++ b/src/Nazara/Core/TaskScheduler.cpp @@ -53,7 +53,8 @@ void NzTaskScheduler::SetWorkerCount(unsigned int workerCount) void NzTaskScheduler::Uninitialize() { - NzTaskSchedulerImpl::Uninitialize(); + if (NzTaskSchedulerImpl::IsInitialized()) + NzTaskSchedulerImpl::Uninitialize(); } void NzTaskScheduler::WaitForTasks() diff --git a/src/Nazara/Core/Win32/TaskSchedulerImpl.cpp b/src/Nazara/Core/Win32/TaskSchedulerImpl.cpp index 4a098d489..90531f9f5 100644 --- a/src/Nazara/Core/Win32/TaskSchedulerImpl.cpp +++ b/src/Nazara/Core/Win32/TaskSchedulerImpl.cpp @@ -102,7 +102,18 @@ void NzTaskSchedulerImpl::Uninitialize() WaitForMultipleObjects(s_workerCount, &s_workerThreads[0], true, INFINITE); for (unsigned int i = 0; i < s_workerCount; ++i) + { + Worker& worker = s_workers[i]; + CloseHandle(s_doneEvents[i]); CloseHandle(s_workerThreads[i]); + CloseHandle(worker.wakeEvent); + DeleteCriticalSection(&worker.queueMutex); + } + + s_doneEvents.reset(); + s_workers.reset(); + s_workerThreads.reset(); + s_workerCount = 0; } void NzTaskSchedulerImpl::WaitForTasks() @@ -197,6 +208,8 @@ unsigned int __stdcall NzTaskSchedulerImpl::WorkerProc(void* userdata) } } + SetEvent(s_doneEvents[workerID]); // Au cas où un thread attendrait sur WaitForTasks() pendant qu'un autre appellerait Uninitialize() + return 0; }