Merge pull request #3936 from yglukhov/threadpool-ios-fix
Fixed semaphore on iOS.
This commit is contained in:
commit
d5180bfb97
1 changed files with 16 additions and 14 deletions
|
|
@ -22,9 +22,9 @@ type
|
||||||
L: Lock
|
L: Lock
|
||||||
counter: int
|
counter: int
|
||||||
|
|
||||||
proc createSemaphore(): Semaphore =
|
proc initSemaphore(cv: var Semaphore) =
|
||||||
initCond(result.c)
|
initCond(cv.c)
|
||||||
initLock(result.L)
|
initLock(cv.L)
|
||||||
|
|
||||||
proc destroySemaphore(cv: var Semaphore) {.inline.} =
|
proc destroySemaphore(cv: var Semaphore) {.inline.} =
|
||||||
deinitCond(cv.c)
|
deinitCond(cv.c)
|
||||||
|
|
@ -77,7 +77,7 @@ proc openBarrier(b: ptr Barrier) {.compilerProc, inline.} =
|
||||||
proc closeBarrier(b: ptr Barrier) {.compilerProc.} =
|
proc closeBarrier(b: ptr Barrier) {.compilerProc.} =
|
||||||
fence()
|
fence()
|
||||||
if b.left != b.entered:
|
if b.left != b.entered:
|
||||||
b.cv = createSemaphore()
|
b.cv.initSemaphore()
|
||||||
fence()
|
fence()
|
||||||
b.interest = true
|
b.interest = true
|
||||||
fence()
|
fence()
|
||||||
|
|
@ -195,7 +195,7 @@ proc nimCreateFlowVar[T](): FlowVar[T] {.compilerProc.} =
|
||||||
new(result, fvFinalizer)
|
new(result, fvFinalizer)
|
||||||
|
|
||||||
proc nimFlowVarCreateSemaphore(fv: FlowVarBase) {.compilerProc.} =
|
proc nimFlowVarCreateSemaphore(fv: FlowVarBase) {.compilerProc.} =
|
||||||
fv.cv = createSemaphore()
|
fv.cv.initSemaphore()
|
||||||
fv.usesSemaphore = true
|
fv.usesSemaphore = true
|
||||||
|
|
||||||
proc nimFlowVarSignal(fv: FlowVarBase) {.compilerProc.} =
|
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
|
## **Note**: This results in non-deterministic behaviour and so should be
|
||||||
## avoided.
|
## avoided.
|
||||||
var ai: AwaitInfo
|
var ai: AwaitInfo
|
||||||
ai.cv = createSemaphore()
|
ai.cv.initSemaphore()
|
||||||
var conflicts = 0
|
var conflicts = 0
|
||||||
for i in 0 .. flowVars.high:
|
for i in 0 .. flowVars.high:
|
||||||
if cas(addr flowVars[i].ai, nil, addr ai):
|
if cas(addr flowVars[i].ai, nil, addr ai):
|
||||||
|
|
@ -294,9 +294,11 @@ var
|
||||||
currentPoolSize: int
|
currentPoolSize: int
|
||||||
maxPoolSize = MaxThreadPoolSize
|
maxPoolSize = MaxThreadPoolSize
|
||||||
minPoolSize = 4
|
minPoolSize = 4
|
||||||
gSomeReady = createSemaphore()
|
gSomeReady : Semaphore
|
||||||
readyWorker: ptr Worker
|
readyWorker: ptr Worker
|
||||||
|
|
||||||
|
gSomeReady.initSemaphore()
|
||||||
|
|
||||||
proc slave(w: ptr Worker) {.thread.} =
|
proc slave(w: ptr Worker) {.thread.} =
|
||||||
while true:
|
while true:
|
||||||
when declared(atomicStoreN):
|
when declared(atomicStoreN):
|
||||||
|
|
@ -354,10 +356,10 @@ when defined(nimRecursiveSpawn):
|
||||||
var localThreadId {.threadvar.}: int
|
var localThreadId {.threadvar.}: int
|
||||||
|
|
||||||
proc activateWorkerThread(i: int) {.noinline.} =
|
proc activateWorkerThread(i: int) {.noinline.} =
|
||||||
workersData[i].taskArrived = createSemaphore()
|
workersData[i].taskArrived.initSemaphore()
|
||||||
workersData[i].taskStarted = createSemaphore()
|
workersData[i].taskStarted.initSemaphore()
|
||||||
workersData[i].initialized = true
|
workersData[i].initialized = true
|
||||||
workersData[i].q.empty = createSemaphore()
|
workersData[i].q.empty.initSemaphore()
|
||||||
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):
|
when defined(nimRecursiveSpawn):
|
||||||
|
|
@ -366,12 +368,12 @@ proc activateWorkerThread(i: int) {.noinline.} =
|
||||||
if gCpus > 0: pinToCpu(workers[i], i mod gCpus)
|
if gCpus > 0: pinToCpu(workers[i], i mod gCpus)
|
||||||
|
|
||||||
proc activateDistinguishedThread(i: int) {.noinline.} =
|
proc activateDistinguishedThread(i: int) {.noinline.} =
|
||||||
distinguishedData[i].taskArrived = createSemaphore()
|
distinguishedData[i].taskArrived.initSemaphore()
|
||||||
distinguishedData[i].taskStarted = createSemaphore()
|
distinguishedData[i].taskStarted.initSemaphore()
|
||||||
distinguishedData[i].initialized = true
|
distinguishedData[i].initialized = true
|
||||||
distinguishedData[i].q.empty = createSemaphore()
|
distinguishedData[i].q.empty.initSemaphore()
|
||||||
initLock(distinguishedData[i].q.lock)
|
initLock(distinguishedData[i].q.lock)
|
||||||
distinguishedData[i].readyForTask = createSemaphore()
|
distinguishedData[i].readyForTask.initSemaphore()
|
||||||
createThread(distinguished[i], distinguishedSlave, addr(distinguishedData[i]))
|
createThread(distinguished[i], distinguishedSlave, addr(distinguishedData[i]))
|
||||||
|
|
||||||
proc setup() =
|
proc setup() =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue