From dfc768542017d1a89dfefe65cfe9fd4da4ab1ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C8=98tefan=20Talpalaru?= Date: Wed, 15 May 2019 08:42:30 +0200 Subject: [PATCH] fixes #11250 (#11251) --- lib/pure/concurrency/threadpool.nim | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/pure/concurrency/threadpool.nim b/lib/pure/concurrency/threadpool.nim index 15dbb10de5..04be704be8 100644 --- a/lib/pure/concurrency/threadpool.nim +++ b/lib/pure/concurrency/threadpool.nim @@ -18,7 +18,7 @@ when not compileOption("threads"): {.error: "Threadpool requires --threads:on option.".} -import cpuinfo, cpuload, locks +import cpuinfo, cpuload, locks, os {.push stackTrace:off.} @@ -570,17 +570,15 @@ proc sync*() = ## A simple barrier to wait for all ``spawn``'ed tasks. ## ## If you need more elaborate waiting, you have to use an explicit barrier. - var toRelease = 0 while true: var allReady = true for i in 0 ..< currentPoolSize: if not allReady: break allReady = allReady and workersData[i].ready if allReady: break - blockUntil(gSomeReady) - inc toRelease - - for i in 0 ..< toRelease: - signal(gSomeReady) + sleep(100) + # We cannot "blockUntil(gSomeReady)" because workers may be shut down between + # the time we establish that some are not "ready" and the time we wait for a + # "signal(gSomeReady)" from inside "slave()" that can never come. setup()