Files
Nim/lib/system/gc_hooks.nim
Jacek Sieka 75f01bd49f Ensure channels don't leak exception effects (#25318)
The forward declarations cause `Exception` to be inferred - also,
`llrecv` is an internal implementation detail and the type of the
received item is controlled by generics, thus the ValueError raised
there seems out of place for the generic api.

(cherry picked from commit 91febf1f4c)
2025-12-02 14:21:33 +01:00

54 lines
1.7 KiB
Nim

#
#
# Nim's Runtime Library
# (c) Copyright 2019 Andreas Rumpf
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#
## Hooks for memory management. Can be used to implement custom garbage
## collectors etc.
type
GlobalMarkerProc = proc () {.nimcall, benign, raises: [], tags: [].}
var
globalMarkersLen: int
globalMarkers: array[0..3499, GlobalMarkerProc]
threadLocalMarkersLen: int
threadLocalMarkers: array[0..3499, GlobalMarkerProc]
proc nimRegisterGlobalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} =
if globalMarkersLen <= high(globalMarkers):
globalMarkers[globalMarkersLen] = markerProc
inc globalMarkersLen
else:
cstderr.rawWrite("[GC] cannot register global variable; too many global variables")
rawQuit 1
proc nimRegisterThreadLocalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} =
if threadLocalMarkersLen <= high(threadLocalMarkers):
threadLocalMarkers[threadLocalMarkersLen] = markerProc
inc threadLocalMarkersLen
else:
cstderr.rawWrite("[GC] cannot register thread local variable; too many thread local variables")
rawQuit 1
proc traverseGlobals*() =
for i in 0..globalMarkersLen-1:
globalMarkers[i]()
proc traverseThreadLocals*() =
for i in 0..threadLocalMarkersLen-1:
threadLocalMarkers[i]()
var
newObjHook*: proc (typ: PNimType, size: int): pointer {.nimcall, tags: [], raises: [], gcsafe.}
traverseObjHook*: proc (p: pointer, op: int) {.nimcall, tags: [], raises: [], gcsafe.}
proc nimGCvisit(p: pointer, op: int) {.inl, compilerRtl, raises: [].} =
traverseObjHook(p, op)
proc newObj(typ: PNimType, size: int): pointer {.inl, compilerRtl, raises: [].} =
result = newObjHook(typ, size)