Fixed semaphore on iOS.

This commit is contained in:
Yuriy Glukhov 2016-03-05 14:20:09 +02:00
commit 9cdb4ee1cb

View file

@ -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() =