summary refs log tree commit diff stats
path: root/tests/concurrency/tnodeadlocks.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-01-13 02:10:03 +0100
committerAraq <rumpf_a@web.de>2014-01-13 02:10:03 +0100
commit20b5f31c03fb556ec0aa2428a40adbac004d8987 (patch)
tree58086941e7d6bb8f480ca1173a95722ada9435b2 /tests/concurrency/tnodeadlocks.nim
parent51ee524109cf7e3e86c676bc1676063a01bfd979 (diff)
downloadNim-20b5f31c03fb556ec0aa2428a40adbac004d8987.tar.gz
new tester; all tests categorized
Diffstat (limited to 'tests/concurrency/tnodeadlocks.nim')
-rw-r--r--tests/concurrency/tnodeadlocks.nim70
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()
+