summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-05-09 22:29:29 +0200
committerAraq <rumpf_a@web.de>2011-05-09 22:29:29 +0200
commitf717f1e628782cc54a69ce589249d694a77015bb (patch)
treefc6346759e2a5b039f6a5333f5774baf7e81366c
parentd2e2d71d05b9a8381bf7fef7bb23da029e576c2a (diff)
downloadNim-f717f1e628782cc54a69ce589249d694a77015bb.tar.gz
threadvar alternative
-rwxr-xr-xlib/system.nim16
-rwxr-xr-xlib/system/cgprocs.nim14
-rwxr-xr-xlib/system/excpt.nim2
-rwxr-xr-xtodo.txt2
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)