dynlib: use posix module (#11623)

(cherry picked from commit 9e7d885f35)
This commit is contained in:
Jacek Sieka
2019-07-08 09:14:35 +02:00
committed by narimiran
parent 585a08548a
commit 0646d6a720
6 changed files with 32 additions and 50 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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):
#

View File

@@ -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

View File

@@ -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)

View File

@@ -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")