summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJacek Sieka <arnetheduck@gmail.com>2019-07-08 09:14:35 +0200
committerMiran <narimiran@disroot.org>2019-07-08 09:14:35 +0200
commit9e7d885f3509a25ee804f2837e24b49a378a1fe1 (patch)
treebd57b9f05acab60dbd21643488d7c1ba13e457c0
parentd0616ed115840053f705a8bf45fa5cf566d3e2b1 (diff)
downloadNim-9e7d885f3509a25ee804f2837e24b49a378a1fe1.tar.gz
dynlib: use posix module (#11623)
-rw-r--r--lib/posix/posix_linux_amd64_consts.nim5
-rw-r--r--lib/posix/posix_other_consts.nim5
-rw-r--r--lib/pure/dynlib.nim28
-rw-r--r--lib/pure/reservedmem.nim6
-rw-r--r--tests/mmaptest.nim33
-rw-r--r--tools/detect/detect.nim5
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")