diff options
author | Araq <rumpf_a@web.de> | 2011-08-11 21:22:23 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-08-11 21:22:23 +0200 |
commit | 7ad5cab17e742eaeb5a6910f79f5bbaaa5e4113c (patch) | |
tree | c43ded120e419fbe9f3c5ee7356b0eed92b0098d | |
parent | a1cdd6e7ffbefb7f1e64847426b3e424656c6291 (diff) | |
download | Nim-7ad5cab17e742eaeb5a6910f79f5bbaaa5e4113c.tar.gz |
added system.running for threads
-rwxr-xr-x | compiler/semtypes.nim | 15 | ||||
-rwxr-xr-x | lib/system/threads.nim | 8 | ||||
-rwxr-xr-x | web/news.txt | 1 |
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 |