Skip to content

Commit

Permalink
Freeing critical sections via atexit in system/alloc and system/io (n…
Browse files Browse the repository at this point in the history
…im-lang#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
  • Loading branch information
Tail Wag Games authored and PMunch committed Mar 28, 2022
1 parent 23ad057 commit ca2113a
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 7 deletions.
3 changes: 0 additions & 3 deletions lib/std/exitprocs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,6 @@ proc callClosures() {.noconv.} =
of kClosure: fun.fun1()
of kNoconv: fun.fun2()

when not defined(js) and not defined(nimOwnedEnabled):
deinitLock(gFunsLock)

template fun() =
if gFuns.len == 0:
addAtExit(callClosures)
Expand Down
3 changes: 3 additions & 0 deletions lib/system/alloc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
8 changes: 4 additions & 4 deletions lib/system/io.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit ca2113a

Please sign in to comment.