summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorNick Greenfield <boyd.greenfield@gmail.com>2014-07-23 11:25:21 -0700
committerNick Greenfield <boyd.greenfield@gmail.com>2014-07-23 11:25:21 -0700
commit272fd42c970d48d526f0d5ab8dc4fef4d8f177e7 (patch)
treea485167318c8ab438b429f9c52ecef94ab3a5261
parentdcf1425eb996db5d39a23c0360573f1addd4a850 (diff)
downloadNim-272fd42c970d48d526f0d5ab8dc4fef4d8f177e7.tar.gz
Add automatic MAP_POPULATE flag for opening read_only (MAP_PRIVATE) and shared (MAP_SHARED) mmap files.
-rw-r--r--lib/posix/posix.nim2
-rw-r--r--lib/pure/memfiles.nim4
2 files changed, 4 insertions, 2 deletions
diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim
index 8e66336c2..17bcc420e 100644
--- a/lib/posix/posix.nim
+++ b/lib/posix/posix.nim
@@ -1375,6 +1375,8 @@ var
     ## Share changes.
   MAP_PRIVATE* {.importc, header: "<sys/mman.h>".}: cint
     ## Changes are private.
+  MAP_POPULATE* {.importc, header: "<sys/mman.h>".}: cint
+    ## Populate (prefault) page tables for a mapping.
   MAP_FIXED* {.importc, header: "<sys/mman.h>".}: cint
     ## Interpret addr exactly.
   MS_ASYNC* {.importc, header: "<sys/mman.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)