mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 04:02:41 +00:00
dynlib: use posix module (#11623)
(cherry picked from commit 9e7d885f35)
This commit is contained in:
@@ -418,6 +418,9 @@ const PROT_READ* = cint(1)
|
||||
const PROT_WRITE* = cint(2)
|
||||
const PROT_EXEC* = cint(4)
|
||||
const PROT_NONE* = cint(0)
|
||||
const MAP_ANONYMOUS* = cint(32)
|
||||
const MAP_FIXED_NOREPLACE* = cint(1048576)
|
||||
const MAP_NORESERVE* = cint(16384)
|
||||
const MAP_SHARED* = cint(1)
|
||||
const MAP_PRIVATE* = cint(2)
|
||||
const MAP_FIXED* = cint(16)
|
||||
@@ -634,7 +637,7 @@ const SC_MQ_OPEN_MAX* = cint(27)
|
||||
const SC_MQ_PRIO_MAX* = cint(28)
|
||||
const SC_NGROUPS_MAX* = cint(3)
|
||||
const SC_OPEN_MAX* = cint(4)
|
||||
const SC_PAGE_SIZE* = cint(30)
|
||||
const SC_PAGESIZE* = cint(30)
|
||||
const SC_PRIORITIZED_IO* = cint(13)
|
||||
const SC_PRIORITY_SCHEDULING* = cint(10)
|
||||
const SC_RAW_SOCKETS* = cint(236)
|
||||
|
||||
@@ -434,6 +434,9 @@ var PROT_READ* {.importc: "PROT_READ", header: "<sys/mman.h>".}: cint
|
||||
var PROT_WRITE* {.importc: "PROT_WRITE", header: "<sys/mman.h>".}: cint
|
||||
var PROT_EXEC* {.importc: "PROT_EXEC", header: "<sys/mman.h>".}: cint
|
||||
var PROT_NONE* {.importc: "PROT_NONE", header: "<sys/mman.h>".}: cint
|
||||
var MAP_ANONYMOUS* {.importc: "MAP_ANONYMOUS", header: "<sys/mman.h>".}: cint
|
||||
var MAP_FIXED_NOREPLACE* {.importc: "MAP_FIXED_NOREPLACE", header: "<sys/mman.h>".}: cint
|
||||
var MAP_NORESERVE* {.importc: "MAP_NORESERVE", header: "<sys/mman.h>".}: cint
|
||||
var MAP_SHARED* {.importc: "MAP_SHARED", header: "<sys/mman.h>".}: cint
|
||||
var MAP_PRIVATE* {.importc: "MAP_PRIVATE", header: "<sys/mman.h>".}: cint
|
||||
var MAP_FIXED* {.importc: "MAP_FIXED", header: "<sys/mman.h>".}: cint
|
||||
@@ -655,7 +658,7 @@ var SC_MQ_OPEN_MAX* {.importc: "_SC_MQ_OPEN_MAX", header: "<unistd.h>".}: cint
|
||||
var SC_MQ_PRIO_MAX* {.importc: "_SC_MQ_PRIO_MAX", header: "<unistd.h>".}: cint
|
||||
var SC_NGROUPS_MAX* {.importc: "_SC_NGROUPS_MAX", header: "<unistd.h>".}: cint
|
||||
var SC_OPEN_MAX* {.importc: "_SC_OPEN_MAX", header: "<unistd.h>".}: cint
|
||||
var SC_PAGE_SIZE* {.importc: "_SC_PAGE_SIZE", header: "<unistd.h>".}: cint
|
||||
var SC_PAGESIZE* {.importc: "_SC_PAGESIZE", header: "<unistd.h>".}: cint
|
||||
var SC_PRIORITIZED_IO* {.importc: "_SC_PRIORITIZED_IO", header: "<unistd.h>".}: cint
|
||||
var SC_PRIORITY_SCHEDULING* {.importc: "_SC_PRIORITY_SCHEDULING", header: "<unistd.h>".}: cint
|
||||
var SC_RAW_SOCKETS* {.importc: "_SC_RAW_SOCKETS", header: "<unistd.h>".}: cint
|
||||
|
||||
@@ -106,7 +106,7 @@ proc loadLibPattern*(pattern: string, global_symbols=false): LibHandle =
|
||||
result = loadLib(c, global_symbols)
|
||||
if not result.isNil: break
|
||||
|
||||
when defined(posix):
|
||||
when defined(posix) and not defined(nintendoswitch):
|
||||
#
|
||||
# =========================================================================
|
||||
# This is an implementation based on the dlfcn interface.
|
||||
@@ -115,24 +115,18 @@ when defined(posix):
|
||||
# as an emulation layer on top of native functions.
|
||||
# =========================================================================
|
||||
#
|
||||
var
|
||||
RTLD_NOW {.importc: "RTLD_NOW", header: "<dlfcn.h>".}: int
|
||||
RTLD_GLOBAL {.importc: "RTLD_GLOBAL", header: "<dlfcn.h>".}: int
|
||||
|
||||
proc dlclose(lib: LibHandle) {.importc, header: "<dlfcn.h>".}
|
||||
proc dlopen(path: cstring, mode: int): LibHandle {.
|
||||
importc, header: "<dlfcn.h>".}
|
||||
proc dlsym(lib: LibHandle, name: cstring): pointer {.
|
||||
importc, header: "<dlfcn.h>".}
|
||||
import posix
|
||||
|
||||
proc loadLib(path: string, global_symbols=false): LibHandle =
|
||||
var flags = RTLD_NOW
|
||||
if global_symbols: flags = flags or RTLD_GLOBAL
|
||||
return dlopen(path, flags)
|
||||
proc loadLib(): LibHandle = return dlopen(nil, RTLD_NOW)
|
||||
proc unloadLib(lib: LibHandle) = dlclose(lib)
|
||||
proc symAddr(lib: LibHandle, name: cstring): pointer =
|
||||
return dlsym(lib, name)
|
||||
let flags =
|
||||
if global_symbols: RTLD_NOW or RTLD_GLOBAL
|
||||
else: RTLD_NOW
|
||||
|
||||
dlopen(path, flags)
|
||||
|
||||
proc loadLib(): LibHandle = dlopen(nil, RTLD_NOW)
|
||||
proc unloadLib(lib: LibHandle) = discard dlclose(lib)
|
||||
proc symAddr(lib: LibHandle, name: cstring): pointer = dlsym(lib, name)
|
||||
|
||||
elif defined(nintendoswitch):
|
||||
#
|
||||
|
||||
@@ -79,12 +79,6 @@ when defined(windows):
|
||||
else:
|
||||
import posix
|
||||
|
||||
var MAP_ANONYMOUS {.importc: "MAP_ANONYMOUS", header: "<sys/mman.h>".}: cint
|
||||
var MAP_NORESERVE {.importc: "MAP_NORESERVE", header: "<sys/mman.h>".}: cint
|
||||
# var MAP_FIXED_NOREPLACE {.importc: "MAP_FIXED_NOREPLACE", header: "<sys/mman.h>".}: cint
|
||||
|
||||
var SC_PAGESIZE {.importc: "_SC_PAGESIZE", header: "<unistd.h>".}: cint
|
||||
|
||||
let allocationGranularity = sysconf(SC_PAGESIZE)
|
||||
|
||||
let
|
||||
|
||||
@@ -1,25 +1,7 @@
|
||||
# Small test program to test for mmap() weirdnesses
|
||||
|
||||
include "lib/system/ansi_c"
|
||||
|
||||
const
|
||||
PageSize = 4096
|
||||
PROT_READ = 1 # page can be read
|
||||
PROT_WRITE = 2 # page can be written
|
||||
MAP_PRIVATE = 2 # Changes are private
|
||||
|
||||
when defined(macosx) or defined(bsd):
|
||||
const MAP_ANONYMOUS = 0x1000
|
||||
elif defined(solaris):
|
||||
const MAP_ANONYMOUS = 0x100
|
||||
else:
|
||||
var
|
||||
MAP_ANONYMOUS {.importc: "MAP_ANONYMOUS", header: "<sys/mman.h>".}: cint
|
||||
|
||||
proc mmap(adr: pointer, len: int, prot, flags, fildes: cint,
|
||||
off: int): pointer {.header: "<sys/mman.h>".}
|
||||
|
||||
proc munmap(adr: pointer, len: int) {.header: "<sys/mman.h>".}
|
||||
import system/ansi_c
|
||||
import posix
|
||||
|
||||
proc osAllocPages(size: int): pointer {.inline.} =
|
||||
result = mmap(nil, size, PROT_READ or PROT_WRITE,
|
||||
@@ -31,18 +13,21 @@ proc osAllocPages(size: int): pointer {.inline.} =
|
||||
|
||||
proc osDeallocPages(p: pointer, size: int) {.inline} =
|
||||
cfprintf(c_stdout, "freed pages %p..%p\n", p, cast[int](p) + size)
|
||||
munmap(p, size-1)
|
||||
discard munmap(p, size-1)
|
||||
|
||||
proc `+!!`(p: pointer, size: int): pointer {.inline.} =
|
||||
result = cast[pointer](cast[int](p) + size)
|
||||
|
||||
const
|
||||
PageShift = when defined(cpu16): 8 else: 12 # \
|
||||
# my tests showed no improvments for using larger page sizes.
|
||||
PageSize = 1 shl PageShift
|
||||
|
||||
var p = osAllocPages(3 * PageSize)
|
||||
|
||||
osDeallocPages(p, PageSize)
|
||||
# If this fails the OS has freed the whole block starting at 'p':
|
||||
echo(cast[ptr int](p +!! (pageSize*2))[])
|
||||
echo(cast[ptr int](p +!! (PageSize*2))[])
|
||||
|
||||
osDeallocPages(p +!! PageSize*2, PageSize)
|
||||
osDeallocPages(p +!! PageSize, PageSize)
|
||||
|
||||
|
||||
|
||||
@@ -567,6 +567,9 @@ v("PROT_READ")
|
||||
v("PROT_WRITE")
|
||||
v("PROT_EXEC")
|
||||
v("PROT_NONE")
|
||||
v("MAP_ANONYMOUS")
|
||||
v("MAP_FIXED_NOREPLACE")
|
||||
v("MAP_NORESERVE")
|
||||
v("MAP_SHARED")
|
||||
v("MAP_PRIVATE")
|
||||
v("MAP_FIXED")
|
||||
@@ -795,7 +798,7 @@ v("_SC_MQ_OPEN_MAX")
|
||||
v("_SC_MQ_PRIO_MAX")
|
||||
v("_SC_NGROUPS_MAX")
|
||||
v("_SC_OPEN_MAX")
|
||||
v("_SC_PAGE_SIZE")
|
||||
v("_SC_PAGESIZE") # Synonym for _SC_PAGE_SIZE
|
||||
v("_SC_PRIORITIZED_IO")
|
||||
v("_SC_PRIORITY_SCHEDULING")
|
||||
v("_SC_RAW_SOCKETS")
|
||||
|
||||
Reference in New Issue
Block a user