diff options
author | Araq <rumpf_a@web.de> | 2011-05-09 22:29:29 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-05-09 22:29:29 +0200 |
commit | f717f1e628782cc54a69ce589249d694a77015bb (patch) | |
tree | fc6346759e2a5b039f6a5333f5774baf7e81366c | |
parent | d2e2d71d05b9a8381bf7fef7bb23da029e576c2a (diff) | |
download | Nim-f717f1e628782cc54a69ce589249d694a77015bb.tar.gz |
threadvar alternative
-rwxr-xr-x | lib/system.nim | 16 | ||||
-rwxr-xr-x | lib/system/cgprocs.nim | 14 | ||||
-rwxr-xr-x | lib/system/excpt.nim | 2 | ||||
-rwxr-xr-x | todo.txt | 2 |
4 files changed, 24 insertions, 10 deletions
diff --git a/lib/system.nim b/lib/system.nim index 93895605c..05e934d01 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -779,6 +779,14 @@ proc compileOption*(option, arg: string): bool {. include "system/inclrtl" when not defined(ecmascript) and not defined(nimrodVm): + + proc atomicInc*(memLoc: var int, x: int): int {.inline.} + ## atomic increment of `memLoc`. Returns the value after the operation. + + proc atomicDec*(memLoc: var int, x: int): int {.inline.} + ## atomic decrement of `memLoc`. Returns the value after the operation. + + include "system/systhread" include "system/cgprocs" proc add *[T](x: var seq[T], y: T) {.magic: "AppendSeqElem", noSideEffect.} @@ -1436,12 +1444,6 @@ proc quit*(errorcode: int = QuitSuccess) {. when not defined(EcmaScript) and not defined(NimrodVM): - proc atomicInc*(memLoc: var int, x: int): int {.inline.} - ## atomic increment of `memLoc`. Returns the value after the operation. - - proc atomicDec*(memLoc: var int, x: int): int {.inline.} - ## atomic decrement of `memLoc`. Returns the value after the operation. - proc initGC() proc initStackBottom() {.inline.} = @@ -1707,7 +1709,7 @@ when not defined(EcmaScript) and not defined(NimrodVM): else: result = n.sons[n.len] - include "system/systhread" + #include "system/systhread" include "system/mmdisp" include "system/sysstr" include "system/assign" diff --git a/lib/system/cgprocs.nim b/lib/system/cgprocs.nim index f77768a7a..3bc3176a8 100755 --- a/lib/system/cgprocs.nim +++ b/lib/system/cgprocs.nim @@ -37,9 +37,11 @@ when defined(windows): proc ThreadVarAlloc(): TThreadVarSlot {.compilerproc, inline.} = result = TlsAlloc() - proc ThreadVarSetValue(s: TThreadVarSlot, value: pointer) {.compilerproc.} = + proc ThreadVarSetValue(s: TThreadVarSlot, value: pointer) {. + compilerproc, inline.} = TlsSetValue(s, value) - proc ThreadVarGetValue(s: TThreadVarSlot): pointer {.compilerproc.} = + proc ThreadVarGetValue(s: TThreadVarSlot): pointer {. + compilerproc, inline.} = result = TlsGetValue(s) else: @@ -58,4 +60,12 @@ else: proc pthread_setspecific(a1: Tpthread_key, a2: pointer): int32 {. importc: "pthread_setspecific", header: "<pthread.h>".} + + proc ThreadVarAlloc(): TThreadVarSlot {.compilerproc, inline.} = + discard pthread_key_create(addr(result), nil) + proc ThreadVarSetValue(s: TThreadVarSlot, value: pointer) {. + compilerproc, inline.} = + discard pthread_setspecific(s, value) + proc ThreadVarGetValue(s: TThreadVarSlot): pointer {.compilerproc, inline.} = + result = pthread_getspecific(s) diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 073013113..1a9816aed 100755 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -39,6 +39,8 @@ type exc: ref E_Base # XXX only needed for bootstrapping; unused context: C_JmpBuf +when hasThreadSupport: nil + var excHandler {.threadvar, compilerproc.}: PSafePoint = nil # list of exception handlers diff --git a/todo.txt b/todo.txt index 1f1c31301..907fb790a 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,6 @@ * thread support: threadvar on Windows seems broken; add --deadlock_prevention:on|off switch -- implicit ref/ptr->var conversion +* implicit ref/ptr->var conversion High priority (version 0.9.0) |