summary refs log tree commit diff stats
path: root/lib/system
diff options
context:
space:
mode:
authorTail Wag Games <carterza@gmail.com>2021-10-29 06:42:44 -0500
committerGitHub <noreply@github.com>2021-10-29 13:42:44 +0200
commitcfdac6666f5772479724e082fb08c2db694d8d40 (patch)
tree466b8a3add8c9a5c298bc23ca5b30d338cec811e /lib/system
parentee703c5db4ceb8d0228b4429c53d85d5f1ff91ea (diff)
downloadNim-cfdac6666f5772479724e082fb08c2db694d8d40.tar.gz
Freeing critical sections via atexit in system/alloc and system/io (#19062)
* adding new system module sysexitprocs and including system exit procedures when registering exit handlers defined in userland

* fixing failing tests and adding initialization guard to handle cases where the module's global init logic isn't invoked first as is the case with some gc implementaions

* js backend shouldn't try to invoke actual system exit procs

* fixing formatting in sysexitprocs.nim

* 256 was too much - my max number of plugins in my engine is 64 and I require two hooks per runtime it looks like with tls emulation turned off, so for my purposes 128 should be sufficient

* so atExit should be enough here, can get rid of all the extra cruft I had added on top since I didn't realize atExit already provided a stack

* done being cute - since newruntime prevents correct cpp codegen for object variants apparently and breaks tests if I try to use std/exitprocs, ddSysExitProc is just going into both modules. Since system doesn't include system/io, polluting system with it doesn't make sense either... at least it is only importc'd when it is required in either module and we don't have to have any weird when defined(nimOwnedEnabled) with a comment explaining why
Diffstat (limited to 'lib/system')
-rw-r--r--lib/system/alloc.nim3
-rw-r--r--lib/system/io.nim8
2 files changed, 7 insertions, 4 deletions
diff --git a/lib/system/alloc.nim b/lib/system/alloc.nim
index 6d83a2c17..2c6ab4462 100644
--- a/lib/system/alloc.nim
+++ b/lib/system/alloc.nim
@@ -1054,9 +1054,12 @@ template instantiateForRegion(allocator: untyped) {.dirty.} =
         it = it.next
 
   when hasThreadSupport:
+    proc addSysExitProc(quitProc: proc() {.noconv.}) {.importc: "atexit", header: "<stdlib.h>".}
+
     var sharedHeap: MemRegion
     var heapLock: SysLock
     initSysLock(heapLock)
+    addSysExitProc(proc() {.noconv.} = deinitSys(heapLock))
 
   proc getFreeMem(): int =
     #sysAssert(result == countFreeMem())
diff --git a/lib/system/io.nim b/lib/system/io.nim
index e7369392a..2ad43acdb 100644
--- a/lib/system/io.nim
+++ b/lib/system/io.nim
@@ -777,15 +777,15 @@ proc setStdIoUnbuffered*() {.tags: [], benign.} =
 
 when declared(stdout):
   when defined(windows) and compileOption("threads"):
+    proc addSysExitProc(quitProc: proc() {.noconv.}) {.importc: "atexit", header: "<stdlib.h>".}
+
     const insideRLocksModule = false
     include "system/syslocks"
 
+
     var echoLock: SysLock
     initSysLock echoLock
-
-    when not defined(js) and not defined(nimOwnedEnabled):
-      import std/exitprocs
-      addExitProc(proc() {.noconv.} = deinitSys echoLock)
+    addSysExitProc(proc() {.noconv.} = deinitSys(echoLock))
 
   const stdOutLock = not defined(windows) and
                      not defined(android) and