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 | |
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.
-rw-r--r-- | src/mmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -30,12 +30,20 @@ /* Some systems fail to define this */ # ifndef MAP_FAILED # define MAP_FAILED ((void*)-1) # endif +# if defined(MAP_POPULATE) +# define GDBM_MMAP_FLAGS MAP_POPULATE +# elif defined(MAP_PREFAULT_READ) +# define GDBM_MMAP_FLAGS MAP_PREFAULT_READ +# else +# define GDBM_MMAP_FLAGS 0 +# endif + /* Translate current offset in the mapped region into the absolute position */ # define _GDBM_MMAPPED_POS(dbf) ((dbf)->mapped_off + (dbf)->mapped_pos) /* Return true if the absolute offset OFF lies within the currentlty mmapped region */ # define _GDBM_IN_MAPPED_REGION_P(dbf, off) \ ((off) >= (dbf)->mapped_off \ @@ -87,13 +95,13 @@ _gdbm_mapped_unmap (GDBM_FILE dbf) Take care to recompute {mapped_off,mapped_pos} so that the former lies on a page size boundary. */ int _gdbm_internal_remap (GDBM_FILE dbf, size_t size) { void *p; - int flags = PROT_READ; + int prot = PROT_READ; size_t page_size = sysconf (_SC_PAGESIZE); if (dbf->mapped_region) { munmap (dbf->mapped_region, dbf->mapped_size); dbf->mapped_region = NULL; @@ -104,15 +112,15 @@ _gdbm_internal_remap (GDBM_FILE dbf, size_t size) return 0; dbf->mapped_pos += dbf->mapped_off % page_size; dbf->mapped_off = (dbf->mapped_off / page_size) * page_size; if (dbf->read_write) - flags |= PROT_WRITE; + prot |= PROT_WRITE; - p = mmap (NULL, dbf->mapped_size, flags, MAP_SHARED, + p = mmap (NULL, dbf->mapped_size, prot, MAP_SHARED | GDBM_MMAP_FLAGS, dbf->desc, dbf->mapped_off); if (p == MAP_FAILED) { dbf->mapped_region = NULL; GDBM_SET_ERRNO (dbf, GDBM_MALLOC_ERROR, FALSE); return -1; |