From 4706d615e942462a532381a8a86bc5fe820c6816 Mon Sep 17 00:00:00 2001 From: Richard Goedeken Date: Tue, 22 Nov 2016 14:15:19 -0800 Subject: [PATCH] fix defect in semaphore implementation which caused application hang at exit time, because not all worker threads get woken up when task semaphore is repeatedly posted (to wake them up) after setting the stopping flag in the thread pool --- IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp b/IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp index 29b109d36f..e40fe5d2cd 100644 --- a/IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp +++ b/IlmBase/IlmThread/IlmThreadSemaphorePosixCompat.cpp @@ -126,7 +126,16 @@ Semaphore::post () if (_semaphore.numWaiting > 0) { - if (int error = ::pthread_cond_signal (&_semaphore.nonZero)) + int error; + if (_semaphore.numWaiting > 1 && _semaphore.count > 1) + { + error = ::pthread_cond_broadcast (&_semaphore.nonZero); + } + else + { + error = ::pthread_cond_signal (&_semaphore.nonZero); + } + if (error) { ::pthread_mutex_unlock (&_semaphore.mutex);