summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2014-08-12 19:50:14 +0200
committerAndreas Rumpf <rumpf_a@web.de>2014-08-12 19:50:14 +0200
commitbba644fbd13df10c93fbac4fc15e740262448e4c (patch)
tree1eaacd127b5be7c70526775ddd86e73910bbce42 /lib
parent4d863ebb5e0dfc2531837925199a5d9cd6cdaab8 (diff)
parenta0df72fcdc8c180b14d4e030c083a6ef1b5320b3 (diff)
downloadNim-bba644fbd13df10c93fbac4fc15e740262448e4c.tar.gz
Merge pull request #1405 from boydgreenfield/add_mmap_map_populate
Add mmap map populate
Diffstat (limited to 'lib')
-rw-r--r--lib/posix/posix.nim10
-rw-r--r--lib/pure/memfiles.nim4
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim
index a5ee05abb..e1bcd9dfc 100644
--- a/lib/posix/posix.nim
+++ b/lib/posix/posix.nim
@@ -1579,6 +1579,16 @@ var
   MSG_OOB* {.importc, header: "<sys/socket.h>".}: cint
     ## Out-of-band data.
 
+
+when defined(linux):
+  var
+    MAP_POPULATE* {.importc, header: "<sys/mman.h>".}: cint
+      ## Populate (prefault) page tables for a mapping.
+else:
+  var
+    MAP_POPULATE*: cint = 0
+
+
 when defined(macosx):
   var
     MSG_HAVEMORE* {.importc, header: "<sys/socket.h>".}: cint
diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim
index 31fefc6c8..ffeb0beff 100644
--- a/lib/pure/memfiles.nim
+++ b/lib/pure/memfiles.nim
@@ -54,7 +54,7 @@ proc mapMem*(m: var TMemFile, mode: TFileMode = fmRead,
       nil,
       mappedSize,
       if readonly: PROT_READ else: PROT_READ or PROT_WRITE,
-      if readonly: MAP_PRIVATE else: MAP_SHARED,
+      if readonly: (MAP_PRIVATE or MAP_POPULATE) else: (MAP_SHARED or MAP_POPULATE),
       m.handle, offset)
     if result == cast[pointer](MAP_FAILED):
       osError(osLastError())
@@ -207,7 +207,7 @@ proc open*(filename: string, mode: TFileMode = fmRead,
       nil,
       result.size,
       if readonly: PROT_READ else: PROT_READ or PROT_WRITE,
-      if readonly: MAP_PRIVATE else: MAP_SHARED,
+      if readonly: (MAP_PRIVATE or MAP_POPULATE) else: (MAP_SHARED or MAP_POPULATE),
       result.handle,
       offset)