mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-01 10:52:14 +00:00
Merge pull request #3936 from yglukhov/threadpool-ios-fix
Fixed semaphore on iOS.
This commit is contained in:
@@ -22,9 +22,9 @@ type
|
||||
L: Lock
|
||||
counter: int
|
||||
|
||||
proc createSemaphore(): Semaphore =
|
||||
initCond(result.c)
|
||||
initLock(result.L)
|
||||
proc initSemaphore(cv: var Semaphore) =
|
||||
initCond(cv.c)
|
||||
initLock(cv.L)
|
||||
|
||||
proc destroySemaphore(cv: var Semaphore) {.inline.} =
|
||||
deinitCond(cv.c)
|
||||
@@ -77,7 +77,7 @@ proc openBarrier(b: ptr Barrier) {.compilerProc, inline.} =
|
||||
proc closeBarrier(b: ptr Barrier) {.compilerProc.} =
|
||||
fence()
|
||||
if b.left != b.entered:
|
||||
b.cv = createSemaphore()
|
||||
b.cv.initSemaphore()
|
||||
fence()
|
||||
b.interest = true
|
||||
fence()
|
||||
@@ -195,7 +195,7 @@ proc nimCreateFlowVar[T](): FlowVar[T] {.compilerProc.} =
|
||||
new(result, fvFinalizer)
|
||||
|
||||
proc nimFlowVarCreateSemaphore(fv: FlowVarBase) {.compilerProc.} =
|
||||
fv.cv = createSemaphore()
|
||||
fv.cv.initSemaphore()
|
||||
fv.usesSemaphore = true
|
||||
|
||||
proc nimFlowVarSignal(fv: FlowVarBase) {.compilerProc.} =
|
||||
@@ -251,7 +251,7 @@ proc awaitAny*(flowVars: openArray[FlowVarBase]): int =
|
||||
## **Note**: This results in non-deterministic behaviour and so should be
|
||||
## avoided.
|
||||
var ai: AwaitInfo
|
||||
ai.cv = createSemaphore()
|
||||
ai.cv.initSemaphore()
|
||||
var conflicts = 0
|
||||
for i in 0 .. flowVars.high:
|
||||
if cas(addr flowVars[i].ai, nil, addr ai):
|
||||
@@ -294,9 +294,11 @@ var
|
||||
currentPoolSize: int
|
||||
maxPoolSize = MaxThreadPoolSize
|
||||
minPoolSize = 4
|
||||
gSomeReady = createSemaphore()
|
||||
gSomeReady : Semaphore
|
||||
readyWorker: ptr Worker
|
||||
|
||||
gSomeReady.initSemaphore()
|
||||
|
||||
proc slave(w: ptr Worker) {.thread.} =
|
||||
while true:
|
||||
when declared(atomicStoreN):
|
||||
@@ -354,10 +356,10 @@ when defined(nimRecursiveSpawn):
|
||||
var localThreadId {.threadvar.}: int
|
||||
|
||||
proc activateWorkerThread(i: int) {.noinline.} =
|
||||
workersData[i].taskArrived = createSemaphore()
|
||||
workersData[i].taskStarted = createSemaphore()
|
||||
workersData[i].taskArrived.initSemaphore()
|
||||
workersData[i].taskStarted.initSemaphore()
|
||||
workersData[i].initialized = true
|
||||
workersData[i].q.empty = createSemaphore()
|
||||
workersData[i].q.empty.initSemaphore()
|
||||
initLock(workersData[i].q.lock)
|
||||
createThread(workers[i], slave, addr(workersData[i]))
|
||||
when defined(nimRecursiveSpawn):
|
||||
@@ -366,12 +368,12 @@ proc activateWorkerThread(i: int) {.noinline.} =
|
||||
if gCpus > 0: pinToCpu(workers[i], i mod gCpus)
|
||||
|
||||
proc activateDistinguishedThread(i: int) {.noinline.} =
|
||||
distinguishedData[i].taskArrived = createSemaphore()
|
||||
distinguishedData[i].taskStarted = createSemaphore()
|
||||
distinguishedData[i].taskArrived.initSemaphore()
|
||||
distinguishedData[i].taskStarted.initSemaphore()
|
||||
distinguishedData[i].initialized = true
|
||||
distinguishedData[i].q.empty = createSemaphore()
|
||||
distinguishedData[i].q.empty.initSemaphore()
|
||||
initLock(distinguishedData[i].q.lock)
|
||||
distinguishedData[i].readyForTask = createSemaphore()
|
||||
distinguishedData[i].readyForTask.initSemaphore()
|
||||
createThread(distinguished[i], distinguishedSlave, addr(distinguishedData[i]))
|
||||
|
||||
proc setup() =
|
||||
|
||||
Reference in New Issue
Block a user