summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-08-11 21:22:23 +0200
committerAraq <rumpf_a@web.de>2011-08-11 21:22:23 +0200
commit7ad5cab17e742eaeb5a6910f79f5bbaaa5e4113c (patch)
treec43ded120e419fbe9f3c5ee7356b0eed92b0098d
parenta1cdd6e7ffbefb7f1e64847426b3e424656c6291 (diff)
downloadNim-7ad5cab17e742eaeb5a6910f79f5bbaaa5e4113c.tar.gz
added system.running for threads
-rwxr-xr-xcompiler/semtypes.nim15
-rwxr-xr-xlib/system/threads.nim8
-rwxr-xr-xweb/news.txt1
3 files changed, 14 insertions, 10 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 728dffc8d..7cdb32c79 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -335,27 +335,22 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var TIntSet, pos: var int,
                       father: PNode, rectype: PSym)
 proc semRecordCase(c: PContext, n: PNode, check: var TIntSet, pos: var int, 
                    father: PNode, rectype: PSym) = 
-  var 
-    covered: biggestint
-    chckCovered: bool
-    a, b: PNode
-    typ: PType
-  a = copyNode(n)
+  var a = copyNode(n)
   checkMinSonsLen(n, 2)
   semRecordNodeAux(c, n.sons[0], check, pos, a, rectype)
   if a.sons[0].kind != nkSym: 
     internalError("semRecordCase: dicriminant is no symbol")
   incl(a.sons[0].sym.flags, sfDiscriminant)
-  covered = 0
-  typ = skipTypes(a.sons[0].Typ, abstractVar)
+  var covered: biggestInt = 0
+  var typ = skipTypes(a.sons[0].Typ, abstractVar)
   if not isOrdinalType(typ): GlobalError(n.info, errSelectorMustBeOrdinal)
   if firstOrd(typ) < 0: 
     GlobalError(n.info, errOrdXMustNotBeNegative, a.sons[0].sym.name.s)
   if lengthOrd(typ) > 0x00007FFF: 
     GlobalError(n.info, errLenXinvalid, a.sons[0].sym.name.s)
-  chckCovered = true
+  var chckCovered = true
   for i in countup(1, sonsLen(n) - 1): 
-    b = copyTree(n.sons[i])
+    var b = copyTree(n.sons[i])
     case n.sons[i].kind
     of nkOfBranch: 
       checkMinSonsLen(b, 2)
diff --git a/lib/system/threads.nim b/lib/system/threads.nim
index a458dffe9..60643b526 100755
--- a/lib/system/threads.nim
+++ b/lib/system/threads.nim
@@ -290,6 +290,10 @@ template ThreadProcWrapperBody(closure: expr) =
   # However this is doomed to fail, because we already unmapped every heap
   # page!
   
+  # mark as not running anymore:
+  t.emptyFn = nil
+  t.dataFn = nil
+  
 {.push stack_trace:off.}
 when defined(windows):
   proc threadProcWrapper[TMsg](closure: pointer): int32 {.stdcall.} = 
@@ -300,6 +304,10 @@ else:
     ThreadProcWrapperBody(closure)
 {.pop.}
 
+proc running*[TMsg](t: TThread[TMsg]): bool {.inline.} = 
+  ## returns true if `t` is running.
+  result = t.emptyFn == nil and t.dataFn == nil
+
 proc joinThread*[TMsg](t: TThread[TMsg]) {.inline.} = 
   ## waits for the thread `t` to finish.
   when hostOS == "windows":
diff --git a/web/news.txt b/web/news.txt
index 61cf024c6..7ffb561df 100755
--- a/web/news.txt
+++ b/web/news.txt
@@ -65,6 +65,7 @@ Library Additions
 - Added ``matchers`` module for email address etc. matching.
 - Added ``strutils.unindent``.
 - Added ``system.slurp`` for easy resource embedding.
+- Added ``system.running`` for threads.
 
 
 2011-07-10 Version 0.8.12 released