diff options
author | Araq <rumpf_a@web.de> | 2014-11-07 01:54:47 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-11-07 01:54:47 +0100 |
commit | 06e9932e8ae6860b1c96c57138d2d56e51f7036d (patch) | |
tree | 8b2d62d2ea914022bb3a6fd68fea15541b8e4212 /lib/pure | |
parent | b5586264a0e0515f88f7ad4944bb987930fbd7b9 (diff) | |
download | Nim-06e9932e8ae6860b1c96c57138d2d56e51f7036d.tar.gz |
fixes exhaustion bug and missing GC_ref code generation
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/concurrency/threadpool.nim | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/lib/pure/concurrency/threadpool.nim b/lib/pure/concurrency/threadpool.nim index 727bbffa2..7959a6c92 100644 --- a/lib/pure/concurrency/threadpool.nim +++ b/lib/pure/concurrency/threadpool.nim @@ -100,7 +100,8 @@ type # for 'awaitAny' support ai: ptr AwaitInfo idx: int - data: RootRef # we incRef and unref it to keep it alive + data: pointer # we incRef and unref it to keep it alive; note this MUST NOT + # be RootRef here otherwise the wrong GC keeps track of it! owner: pointer # ptr Worker FlowVarObj[T] = object of FlowVarBaseObj @@ -162,10 +163,8 @@ proc finished(fv: FlowVarBase) = var waited = false acquire(q.lock) while not (q.len < q.data.len): - echo "EXHAUSTED!" - release(q.lock) + #echo "EXHAUSTED!" wakeupWorkerToProcessQueue(owner) - acquire(q.lock) wait(q.empty, q.lock) waited = true q.data[q.len] = cast[pointer](fv.data) @@ -180,7 +179,7 @@ proc cleanFlowVars(w: ptr Worker) = acquire(q.lock) for i in 0 .. <q.len: GC_unref(cast[RootRef](q.data[i])) - echo "GC_unref" + #echo "GC_unref" q.len = 0 release(q.lock) signal(q.empty) |