diff options
-rw-r--r-- | lib/core/runtime_v2.nim | 26 |
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 |