diff options
author | Jacek Sieka <arnetheduck@gmail.com> | 2019-07-08 09:14:35 +0200 |
---|---|---|
committer | Miran <narimiran@disroot.org> | 2019-07-08 09:14:35 +0200 |
commit | 9e7d885f3509a25ee804f2837e24b49a378a1fe1 (patch) | |
tree | bd57b9f05acab60dbd21643488d7c1ba13e457c0 | |
parent | d0616ed115840053f705a8bf45fa5cf566d3e2b1 (diff) | |
download | Nim-9e7d885f3509a25ee804f2837e24b49a378a1fe1.tar.gz |
dynlib: use posix module (#11623)
-rw-r--r-- | lib/posix/posix_linux_amd64_consts.nim | 5 | ||||
-rw-r--r-- | lib/posix/posix_other_consts.nim | 5 | ||||
-rw-r--r-- | lib/pure/dynlib.nim | 28 | ||||
-rw-r--r-- | lib/pure/reservedmem.nim | 6 | ||||
-rw-r--r-- | tests/mmaptest.nim | 33 | ||||
-rw-r--r-- | tools/detect/detect.nim | 5 |
6 files changed, 32 insertions, 50 deletions
diff --git a/lib/posix/posix_linux_amd64_consts.nim b/lib/posix/posix_linux_amd64_consts.nim index dfbfe7f64..7352e8e35 100644 --- a/lib/posix/posix_linux_amd64_consts.nim +++ b/lib/posix/posix_linux_amd64_consts.nim @@ -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) diff --git a/lib/posix/posix_other_consts.nim b/lib/posix/posix_other_consts.nim index cd5199078..9fcbe425d 100644 --- a/lib/posix/posix_other_consts.nim +++ b/lib/posix/posix_other_consts.nim @@ -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 diff --git a/lib/pure/dynlib.nim b/lib/pure/dynlib.nim index ff12be90f..f3f9b1308 100644 --- a/lib/pure/dynlib.nim +++ b/lib/pure/dynlib.nim @@ -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): # diff --git a/lib/pure/reservedmem.nim b/lib/pure/reservedmem.nim index 22e2b5096..41fcf68ea 100644 --- a/lib/pure/reservedmem.nim +++ b/lib/pure/reservedmem.nim @@ -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 diff --git a/tests/mmaptest.nim b/tests/mmaptest.nim index 84036cbf0..7abdab45f 100644 --- a/tests/mmaptest.nim +++ b/tests/mmaptest.nim @@ -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) - - diff --git a/tools/detect/detect.nim b/tools/detect/detect.nim index 5b4fdc99e..fcbedcfcd 100644 --- a/tools/detect/detect.nim +++ b/tools/detect/detect.nim @@ -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") |