summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorYuriy Glukhov <yutiy.glukhov@gmail.com>2016-03-05 14:20:09 +0200
committerYuriy Glukhov <yutiy.glukhov@gmail.com>2016-03-05 14:20:09 +0200
commit9cdb4ee1cbd7928eb87699f246c7fe322273d058 (patch)
tree0da05eecfd9c79efadbf58a21ab74fd18ab92ad2 /lib/pure
parent1d443cec8d5b5e7bd7d73b005527e6224cd2346a (diff)
downloadNim-9cdb4ee1cbd7928eb87699f246c7fe322273d058.tar.gz
Fixed semaphore on iOS.
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/concurrency/threadpool.nim30
1 files changed, 16 insertions, 14 deletions
diff --git a/lib/pure/concurrency/threadpool.nim b/lib/pure/concurrency/threadpool.nim
index a30d49889..9490dbbd5 100644
--- a/lib/pure/concurrency/threadpool.nim
+++ b/lib/pure/concurrency/threadpool.nim
@@ -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() =