attempt to support recursions for spawn
This commit is contained in:
parent
b1a55d83ec
commit
d7996a9ede
1 changed files with 20 additions and 2 deletions
|
|
@ -295,7 +295,8 @@ proc slave(w: ptr Worker) {.thread.} =
|
||||||
readyWorker = w
|
readyWorker = w
|
||||||
signal(gSomeReady)
|
signal(gSomeReady)
|
||||||
await(w.taskArrived)
|
await(w.taskArrived)
|
||||||
# XXX Somebody needs to look into this (why does this assertion fail in Visual Studio?)
|
# XXX Somebody needs to look into this (why does this assertion fail
|
||||||
|
# in Visual Studio?)
|
||||||
when not defined(vcc): assert(not w.ready)
|
when not defined(vcc): assert(not w.ready)
|
||||||
w.f(w, w.data)
|
w.f(w, w.data)
|
||||||
if w.q.len != 0: w.cleanFlowVars
|
if w.q.len != 0: w.cleanFlowVars
|
||||||
|
|
@ -338,6 +339,9 @@ proc setMaxPoolSize*(size: range[1..MaxThreadPoolSize]) =
|
||||||
let w = addr(workersData[i])
|
let w = addr(workersData[i])
|
||||||
w.shutdown = true
|
w.shutdown = true
|
||||||
|
|
||||||
|
when defined(nimRecursiveSpawn):
|
||||||
|
var localThreadId {.threadvar.}: int
|
||||||
|
|
||||||
proc activateWorkerThread(i: int) {.noinline.} =
|
proc activateWorkerThread(i: int) {.noinline.} =
|
||||||
workersData[i].taskArrived = createSemaphore()
|
workersData[i].taskArrived = createSemaphore()
|
||||||
workersData[i].taskStarted = createSemaphore()
|
workersData[i].taskStarted = createSemaphore()
|
||||||
|
|
@ -345,6 +349,8 @@ proc activateWorkerThread(i: int) {.noinline.} =
|
||||||
workersData[i].q.empty = createSemaphore()
|
workersData[i].q.empty = createSemaphore()
|
||||||
initLock(workersData[i].q.lock)
|
initLock(workersData[i].q.lock)
|
||||||
createThread(workers[i], slave, addr(workersData[i]))
|
createThread(workers[i], slave, addr(workersData[i]))
|
||||||
|
when defined(nimRecursiveSpawn):
|
||||||
|
localThreadId = i+1
|
||||||
when defined(nimPinToCpu):
|
when defined(nimPinToCpu):
|
||||||
if gCpus > 0: pinToCpu(workers[i], i mod gCpus)
|
if gCpus > 0: pinToCpu(workers[i], i mod gCpus)
|
||||||
|
|
||||||
|
|
@ -436,6 +442,18 @@ proc nimSpawn3(fn: WorkerProc; data: pointer) {.compilerProc.} =
|
||||||
release(stateLock)
|
release(stateLock)
|
||||||
# else the acquire failed, but this means some
|
# else the acquire failed, but this means some
|
||||||
# other thread succeeded, so we don't need to do anything here.
|
# other thread succeeded, so we don't need to do anything here.
|
||||||
|
when defined(nimRecursiveSpawn):
|
||||||
|
if localThreadId > 0:
|
||||||
|
# we are a worker thread, so instead of waiting for something which
|
||||||
|
# might as well never happen (see tparallel_quicksort), we run the task
|
||||||
|
# on the current thread instead.
|
||||||
|
var self = addr(workersData[localThreadId-1])
|
||||||
|
fn(self, data)
|
||||||
|
await(self.taskStarted)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
await(gSomeReady)
|
||||||
|
else:
|
||||||
await(gSomeReady)
|
await(gSomeReady)
|
||||||
|
|
||||||
var
|
var
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue