summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/core/runtime_v2.nim26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/core/runtime_v2.nim b/lib/core/runtime_v2.nim
index 4bc271f49..149c426e1 100644
--- a/lib/core/runtime_v2.nim
+++ b/lib/core/runtime_v2.nim
@@ -52,17 +52,30 @@ proc nimNewObj(size: int): pointer {.compilerRtl.} =
     result = orig +! sizeof(RefHeader)
   else:
     result = alloc0(s) +! sizeof(RefHeader)
-  inc allocs
+  when hasThreadSupport:
+    atomicInc allocs
+  else:
+    inc allocs
 
 proc nimDecWeakRef(p: pointer) {.compilerRtl.} =
-  dec head(p).rc
+  when hasThreadSupport:
+    atomicDec head(p).rc
+  else:
+    dec head(p).rc
 
 proc nimIncWeakRef(p: pointer) {.compilerRtl.} =
-  inc head(p).rc
+  when hasThreadSupport:
+    atomicInc head(p).rc
+  else:
+    inc head(p).rc
 
 proc nimRawDispose(p: pointer) {.compilerRtl.} =
   when not defined(nimscript):
-    if head(p).rc != 0:
+    when hasThreadSupport:
+      let hasDanglingRefs = atomicLoadN(addr head(p).rc, ATOMIC_RELAXED) != 0
+    else:
+      let hasDanglingRefs = head(p).rc != 0
+    if hasDanglingRefs:
       cstderr.rawWrite "[FATAL] dangling references exist\n"
       quit 1
     when defined(useMalloc):
@@ -70,7 +83,10 @@ proc nimRawDispose(p: pointer) {.compilerRtl.} =
     else:
       dealloc(p -! sizeof(RefHeader))
     if allocs > 0:
-      dec allocs
+      when hasThreadSupport:
+        atomicDec allocs
+      else:
+        dec allocs
     else:
       cstderr.rawWrite "[FATAL] unpaired dealloc\n"
       quit 1