From 7ad5cab17e742eaeb5a6910f79f5bbaaa5e4113c Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 11 Aug 2011 21:22:23 +0200 Subject: added system.running for threads --- compiler/semtypes.nim | 15 +++++---------- lib/system/threads.nim | 8 ++++++++ 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 -- cgit 1.4.1-2-gfad0