From 272fd42c970d48d526f0d5ab8dc4fef4d8f177e7 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Wed, 23 Jul 2014 11:25:21 -0700 Subject: [PATCH] Add automatic MAP_POPULATE flag for opening read_only (MAP_PRIVATE) and shared (MAP_SHARED) mmap files. --- lib/posix/posix.nim | 2 ++ lib/pure/memfiles.nim | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim index 8e66336c2e..17bcc420ed 100644 --- a/lib/posix/posix.nim +++ b/lib/posix/posix.nim @@ -1375,6 +1375,8 @@ var ## Share changes. MAP_PRIVATE* {.importc, header: "".}: cint ## Changes are private. + MAP_POPULATE* {.importc, header: "".}: cint + ## Populate (prefault) page tables for a mapping. MAP_FIXED* {.importc, header: "".}: cint ## Interpret addr exactly. MS_ASYNC* {.importc, header: "".}: cint diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim index 31fefc6c82..ffeb0beffe 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)