diff options
author | Araq <rumpf_a@web.de> | 2014-01-13 02:10:03 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-01-13 02:10:03 +0100 |
commit | 20b5f31c03fb556ec0aa2428a40adbac004d8987 (patch) | |
tree | 58086941e7d6bb8f480ca1173a95722ada9435b2 /tests/concurrency/tnodeadlocks.nim | |
parent | 51ee524109cf7e3e86c676bc1676063a01bfd979 (diff) | |
download | Nim-20b5f31c03fb556ec0aa2428a40adbac004d8987.tar.gz |
new tester; all tests categorized
Diffstat (limited to 'tests/concurrency/tnodeadlocks.nim')
-rw-r--r-- | tests/concurrency/tnodeadlocks.nim | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/concurrency/tnodeadlocks.nim b/tests/concurrency/tnodeadlocks.nim new file mode 100644 index 000000000..18fdca3e9 --- /dev/null +++ b/tests/concurrency/tnodeadlocks.nim @@ -0,0 +1,70 @@ +discard """ + outputsub: "101" + cmd: "nimrod cc --hints:on --threads:on $# $#" +""" + +import os, locks + +const + noDeadlocks = defined(preventDeadlocks) + +var + thr: array [0..5, TThread[tuple[a, b: int]]] + L, M, N: TLock + +proc doNothing() = nil + +proc threadFunc(interval: tuple[a, b: int]) {.thread.} = + doNothing() + for i in interval.a..interval.b: + when nodeadlocks: + case i mod 6 + of 0: + Acquire(L) # lock stdout + Acquire(M) + Acquire(N) + of 1: + Acquire(L) + Acquire(N) # lock stdout + Acquire(M) + of 2: + Acquire(M) + Acquire(L) + Acquire(N) + of 3: + Acquire(M) + Acquire(N) + Acquire(L) + of 4: + Acquire(N) + Acquire(M) + Acquire(L) + of 5: + Acquire(N) + Acquire(L) + Acquire(M) + else: assert false + else: + Acquire(L) # lock stdout + Acquire(M) + + echo i + os.sleep(10) + when nodeadlocks: + echo "deadlocks prevented: ", deadlocksPrevented + when nodeadlocks: + Release(N) + Release(M) + Release(L) + +InitLock(L) +InitLock(M) +InitLock(N) + +proc main = + for i in 0..high(thr): + createThread(thr[i], threadFunc, (i*100, i*100+50)) + joinThreads(thr) + +main() + |