From 416ba133ad1e62cc8ce7241c85e89d5707b5736f Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 12 Jul 2019 16:08:30 +0200 Subject: made --newruntime ready for multi-threading --- lib/core/runtime_v2.nim | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'lib/core/runtime_v2.nim') 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 -- cgit 1.4.1-2-gfad0