From 943d4ee71448f7efd2a7feb1126a401f68573979 Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 8 Nov 2014 11:18:25 +0100 Subject: fixed the deadlock that happens when stress testing ToFreeQueue --- lib/pure/concurrency/threadpool.nim | 55 ++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 25 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/concurrency/threadpool.nim b/lib/pure/concurrency/threadpool.nim index 7959a6c92..1e1f0c26d 100644 --- a/lib/pure/concurrency/threadpool.nim +++ b/lib/pure/concurrency/threadpool.nim @@ -112,8 +112,8 @@ type ToFreeQueue = object len: int lock: TLock - empty: TCond - data: array[2, pointer] + empty: CondVar + data: array[128, pointer] WorkerProc = proc (thread, args: pointer) {.nimcall, gcsafe.} Worker = object @@ -143,13 +143,27 @@ proc selectWorker(w: ptr Worker; fn: WorkerProc; data: pointer): bool = await(w.taskStarted) result = true +proc cleanFlowVars(w: ptr Worker) = + let q = addr(w.q) + acquire(q.lock) + for i in 0 ..