summary refs log tree commit diff stats
path: root/lib/pure/concurrency
diff options
context:
space:
mode:
authorYuriy Glukhov <yglukhov@users.noreply.github.com>2017-07-17 09:09:21 +0300
committerAndreas Rumpf <rumpf_a@web.de>2017-07-17 08:09:21 +0200
commitbdb653c4156af099814df2e21b9878cdb1591190 (patch)
treec7d3498bcfe04a408ecdad8dae77a8d6ddc0dd99 /lib/pure/concurrency
parentc245cfc1fd4143553bcce99669a85f093e4b88a7 (diff)
downloadNim-bdb653c4156af099814df2e21b9878cdb1591190.tar.gz
GC_fullCollect on sync threadpool (#6107)
Diffstat (limited to 'lib/pure/concurrency')
-rw-r--r--lib/pure/concurrency/threadpool.nim16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/pure/concurrency/threadpool.nim b/lib/pure/concurrency/threadpool.nim
index cf4f58588..9e19e47b5 100644
--- a/lib/pure/concurrency/threadpool.nim
+++ b/lib/pure/concurrency/threadpool.nim
@@ -526,10 +526,12 @@ proc nimSpawn4(fn: WorkerProc; data: pointer; id: ThreadId) {.compilerProc.} =
     if selectWorker(addr(distinguishedData[id]), fn, data): break
     await(distinguishedData[id].readyForTask)
 
+template spawnInAllThreads(e: untyped) =
+  ## Spawn `e` on all of the threadpool threads.
+  for i in 0 .. <currentPoolSize:
+    pinnedSpawn(i, e)
 
-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.
+proc syncAux() {.inline.} =
   var toRelease = 0
   while true:
     var allReady = true
@@ -543,4 +545,12 @@ proc sync*() =
   for i in 0 ..< toRelease:
     signal(gSomeReady)
 
+proc sync*(cleanup: bool = true) =
+  ## A simple barrier to wait for all spawn'ed tasks. Calls `GC_fullCollect()`
+  ## on all threads if `cleanup` is `true`. If you need more elaborate
+  ## waiting, you have to use an explicit barrier.
+  syncAux()
+  if cleanup:
+    spawnInAllThreads GC_fullCollect()
+
 setup()