diff options
author | Yuriy Glukhov <yglukhov@users.noreply.github.com> | 2017-07-17 09:09:21 +0300 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-07-17 08:09:21 +0200 |
commit | bdb653c4156af099814df2e21b9878cdb1591190 (patch) | |
tree | c7d3498bcfe04a408ecdad8dae77a8d6ddc0dd99 /lib/pure/concurrency | |
parent | c245cfc1fd4143553bcce99669a85f093e4b88a7 (diff) | |
download | Nim-bdb653c4156af099814df2e21b9878cdb1591190.tar.gz |
GC_fullCollect on sync threadpool (#6107)
Diffstat (limited to 'lib/pure/concurrency')
-rw-r--r-- | lib/pure/concurrency/threadpool.nim | 16 |
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() |