From 5aa7b1a44b869303e09e0ab0df6a63c2171a1806 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 24 Dec 2019 12:08:22 +0100 Subject: [PATCH] ARC: default to a shared heap with --threads:on --- lib/system.nim | 10 +++++----- lib/system/allocators.nim | 6 ++++++ lib/system/refs_v2.nim | 4 ++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/system.nim b/lib/system.nim index 89f79a7992..58250db3f2 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2469,7 +2469,7 @@ when not defined(nimscript): ## The freed memory must belong to its allocating thread! ## Use `deallocShared <#deallocShared,pointer>`_ to deallocate from a shared heap. - proc allocShared*(size: Natural): pointer {.noconv, rtl, benign, raises: [].} + proc allocShared*(size: Natural): pointer {.noconv, rtl, benign, raises: [], tags: [].} ## Allocates a new memory block on the shared heap with at ## least ``size`` bytes. ## @@ -2482,7 +2482,7 @@ when not defined(nimscript): ## ## See also: ## `allocShared0 <#allocShared0,Natural>`_. - proc createSharedU*(T: typedesc, size = 1.Positive): ptr T {.inline, + proc createSharedU*(T: typedesc, size = 1.Positive): ptr T {.inline, tags: [], benign, raises: [].} = ## Allocates a new memory block on the shared heap with at ## least ``T.sizeof * size`` bytes. @@ -2498,7 +2498,7 @@ when not defined(nimscript): ## * `createShared <#createShared,typedesc>`_ cast[ptr T](allocShared(T.sizeof * size)) - proc allocShared0*(size: Natural): pointer {.noconv, rtl, benign, raises: [].} + proc allocShared0*(size: Natural): pointer {.noconv, rtl, benign, raises: [], tags: [].} ## Allocates a new memory block on the shared heap with at ## least ``size`` bytes. ## @@ -2522,7 +2522,7 @@ when not defined(nimscript): ## `createSharedU <#createSharedU,typedesc>`_. cast[ptr T](allocShared0(T.sizeof * size)) - proc reallocShared*(p: pointer, newSize: Natural): pointer {.noconv, rtl, + proc reallocShared*(p: pointer, newSize: Natural): pointer {.noconv, rtl, tags: [], benign, raises: [].} ## Grows or shrinks a given memory block on the heap. ## @@ -2543,7 +2543,7 @@ when not defined(nimscript): ## `freeShared <#freeShared,ptr.T>`_. cast[ptr T](reallocShared(p, T.sizeof * newSize)) - proc deallocShared*(p: pointer) {.noconv, rtl, benign, raises: [].} + proc deallocShared*(p: pointer) {.noconv, rtl, benign, raises: [], tags: [].} ## Frees the memory allocated with ``allocShared``, ``allocShared0`` or ## ``reallocShared``. ## diff --git a/lib/system/allocators.nim b/lib/system/allocators.nim index 43aae01119..e642999a81 100644 --- a/lib/system/allocators.nim +++ b/lib/system/allocators.nim @@ -46,18 +46,24 @@ proc getLocalAllocator*(): Allocator = result = c_malloc(cuint size) # XXX do we need this? nimZeroMem(result, size) + elif compileOption("threads"): + result = system.allocShared0(size) else: result = system.alloc0(size) inc a.allocCount result.dealloc = proc (a: Allocator; p: pointer; size: int) {.nimcall, raises: [].} = when defined(useMalloc) and not defined(nimscript): c_free(p) + elif compileOption("threads"): + system.deallocShared(p) else: system.dealloc(p) inc a.deallocCount result.realloc = proc (a: Allocator; p: pointer; oldSize, newSize: int): pointer {.nimcall, raises: [].} = when defined(useMalloc) and not defined(nimscript): result = c_realloc(p, cuint newSize) + elif compileOption("threads"): + result = system.reallocShared(p, newSize) else: result = system.realloc(p, newSize) nimZeroMem(result +! oldSize, newSize - oldSize) diff --git a/lib/system/refs_v2.nim b/lib/system/refs_v2.nim index 3033880c31..6fd34fca6d 100644 --- a/lib/system/refs_v2.nim +++ b/lib/system/refs_v2.nim @@ -67,6 +67,8 @@ proc nimNewObj(size: int): pointer {.compilerRtl.} = var orig = c_malloc(cuint s) nimZeroMem(orig, s) result = orig +! sizeof(RefHeader) + elif compileOption("threads"): + result = allocShared0(s) +! sizeof(RefHeader) else: result = alloc0(s) +! sizeof(RefHeader) when hasThreadSupport: @@ -93,6 +95,8 @@ proc nimRawDispose(p: pointer) {.compilerRtl.} = quit 1 when defined(useMalloc): c_free(p -! sizeof(RefHeader)) + elif compileOption("threads"): + deallocShared(p -! sizeof(RefHeader)) else: dealloc(p -! sizeof(RefHeader)) if allocs > 0: