diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-10-29 15:14:54 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-10-29 15:17:09 +0200 |
commit | 4fb2326a4ac0e6f45c21f7651b1c87317567fd82 (patch) | |
tree | 39322c773faaf036132a44e114543c120d4ae902 /src/mmap.c | |
parent | 5da09d08428079739170bd2b64db4997b04b38ec (diff) | |
download | gdbm-4fb2326a4ac0e6f45c21f7651b1c87317567fd82.tar.gz gdbm-4fb2326a4ac0e6f45c21f7651b1c87317567fd82.tar.bz2 |
Pre-read the memory mapped regions on systems that support it
* src/mmap.c (GDBM_MMAP_FLAGS): Define to MAP_POPULATE or
MAP_PREFAULT_READ, if available.
(_gdbm_internal_remap): Use GDBM_MMAP_FLAGS.
Diffstat (limited to 'src/mmap.c')
-rw-r--r-- | src/mmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -33,6 +33,14 @@ | |||
33 | # define MAP_FAILED ((void*)-1) | 33 | # define MAP_FAILED ((void*)-1) |
34 | # endif | 34 | # endif |
35 | 35 | ||
36 | # if defined(MAP_POPULATE) | ||
37 | # define GDBM_MMAP_FLAGS MAP_POPULATE | ||
38 | # elif defined(MAP_PREFAULT_READ) | ||
39 | # define GDBM_MMAP_FLAGS MAP_PREFAULT_READ | ||
40 | # else | ||
41 | # define GDBM_MMAP_FLAGS 0 | ||
42 | # endif | ||
43 | |||
36 | /* Translate current offset in the mapped region into the absolute position */ | 44 | /* Translate current offset in the mapped region into the absolute position */ |
37 | # define _GDBM_MMAPPED_POS(dbf) ((dbf)->mapped_off + (dbf)->mapped_pos) | 45 | # define _GDBM_MMAPPED_POS(dbf) ((dbf)->mapped_off + (dbf)->mapped_pos) |
38 | /* Return true if the absolute offset OFF lies within the currentlty mmapped | 46 | /* Return true if the absolute offset OFF lies within the currentlty mmapped |
@@ -90,7 +98,7 @@ int | |||
90 | _gdbm_internal_remap (GDBM_FILE dbf, size_t size) | 98 | _gdbm_internal_remap (GDBM_FILE dbf, size_t size) |
91 | { | 99 | { |
92 | void *p; | 100 | void *p; |
93 | int flags = PROT_READ; | 101 | int prot = PROT_READ; |
94 | size_t page_size = sysconf (_SC_PAGESIZE); | 102 | size_t page_size = sysconf (_SC_PAGESIZE); |
95 | 103 | ||
96 | if (dbf->mapped_region) | 104 | if (dbf->mapped_region) |
@@ -107,9 +115,9 @@ _gdbm_internal_remap (GDBM_FILE dbf, size_t size) | |||
107 | dbf->mapped_off = (dbf->mapped_off / page_size) * page_size; | 115 | dbf->mapped_off = (dbf->mapped_off / page_size) * page_size; |
108 | 116 | ||
109 | if (dbf->read_write) | 117 | if (dbf->read_write) |
110 | flags |= PROT_WRITE; | 118 | prot |= PROT_WRITE; |
111 | 119 | ||
112 | p = mmap (NULL, dbf->mapped_size, flags, MAP_SHARED, | 120 | p = mmap (NULL, dbf->mapped_size, prot, MAP_SHARED | GDBM_MMAP_FLAGS, |
113 | dbf->desc, dbf->mapped_off); | 121 | dbf->desc, dbf->mapped_off); |
114 | if (p == MAP_FAILED) | 122 | if (p == MAP_FAILED) |
115 | { | 123 | { |