summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/os_posix/os_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/os_posix/os_map.c')
-rw-r--r--src/third_party/wiredtiger/src/os_posix/os_map.c231
1 files changed, 112 insertions, 119 deletions
diff --git a/src/third_party/wiredtiger/src/os_posix/os_map.c b/src/third_party/wiredtiger/src/os_posix/os_map.c
index f0c251bca59..3008ec28c95 100644
--- a/src/third_party/wiredtiger/src/os_posix/os_map.c
+++ b/src/third_party/wiredtiger/src/os_posix/os_map.c
@@ -10,163 +10,156 @@
/*
* __wt_posix_map --
- * Map a file into memory.
+ * Map a file into memory.
*/
int
-__wt_posix_map(WT_FILE_HANDLE *fh, WT_SESSION *wt_session,
- void *mapped_regionp, size_t *lenp, void *mapped_cookiep)
+__wt_posix_map(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_regionp, size_t *lenp,
+ void *mapped_cookiep)
{
- WT_FILE_HANDLE_POSIX *pfh;
- WT_SESSION_IMPL *session;
- wt_off_t file_size;
- size_t len;
- void *map;
-
- WT_UNUSED(mapped_cookiep);
-
- session = (WT_SESSION_IMPL *)wt_session;
- pfh = (WT_FILE_HANDLE_POSIX *)fh;
-
- /*
- * Mapping isn't possible if direct I/O configured for the file, the
- * Linux open(2) documentation says applications should avoid mixing
- * mmap(2) of files with direct I/O to the same files.
- */
- if (pfh->direct_io)
- return (__wt_set_return(session, ENOTSUP));
-
- /*
- * There's no locking here to prevent the underlying file from changing
- * underneath us, our caller needs to ensure consistency of the mapped
- * region vs. any other file activity.
- */
- WT_RET(fh->fh_size(fh, wt_session, &file_size));
- len = (size_t)file_size;
-
- __wt_verbose(session, WT_VERB_HANDLEOPS,
- "%s: memory-map: %" WT_SIZET_FMT " bytes", fh->name, len);
-
- if ((map = mmap(NULL, len,
- PROT_READ,
+ WT_FILE_HANDLE_POSIX *pfh;
+ WT_SESSION_IMPL *session;
+ wt_off_t file_size;
+ size_t len;
+ void *map;
+
+ WT_UNUSED(mapped_cookiep);
+
+ session = (WT_SESSION_IMPL *)wt_session;
+ pfh = (WT_FILE_HANDLE_POSIX *)fh;
+
+ /*
+ * Mapping isn't possible if direct I/O configured for the file, the Linux open(2) documentation
+ * says applications should avoid mixing mmap(2) of files with direct I/O to the same files.
+ */
+ if (pfh->direct_io)
+ return (__wt_set_return(session, ENOTSUP));
+
+ /*
+ * There's no locking here to prevent the underlying file from changing underneath us, our
+ * caller needs to ensure consistency of the mapped region vs. any other file activity.
+ */
+ WT_RET(fh->fh_size(fh, wt_session, &file_size));
+ len = (size_t)file_size;
+
+ __wt_verbose(
+ session, WT_VERB_HANDLEOPS, "%s: memory-map: %" WT_SIZET_FMT " bytes", fh->name, len);
+
+ if ((map = mmap(NULL, len, PROT_READ,
#ifdef MAP_NOCORE
- MAP_NOCORE |
+ MAP_NOCORE |
#endif
- MAP_PRIVATE,
- pfh->fd, (wt_off_t)0)) == MAP_FAILED)
- WT_RET_MSG(session,
- __wt_errno(), "%s: memory-map: mmap", fh->name);
-
- *(void **)mapped_regionp = map;
- *lenp = len;
- return (0);
+ MAP_PRIVATE,
+ pfh->fd, (wt_off_t)0)) == MAP_FAILED)
+ WT_RET_MSG(session, __wt_errno(), "%s: memory-map: mmap", fh->name);
+
+ *(void **)mapped_regionp = map;
+ *lenp = len;
+ return (0);
}
#ifdef HAVE_POSIX_MADVISE
/*
* __wt_posix_map_preload --
- * Cause a section of a memory map to be faulted in.
+ * Cause a section of a memory map to be faulted in.
*/
int
-__wt_posix_map_preload(WT_FILE_HANDLE *fh,
- WT_SESSION *wt_session, const void *map, size_t length, void *mapped_cookie)
+__wt_posix_map_preload(
+ WT_FILE_HANDLE *fh, WT_SESSION *wt_session, const void *map, size_t length, void *mapped_cookie)
{
- WT_BM *bm;
- WT_CONNECTION_IMPL *conn;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
- void *blk;
-
- WT_UNUSED(mapped_cookie);
-
- session = (WT_SESSION_IMPL *)wt_session;
-
- conn = S2C(session);
- bm = S2BT(session)->bm;
-
- /* Linux requires the address be aligned to a 4KB boundary. */
- blk = (void *)((uintptr_t)map & ~(uintptr_t)(conn->page_size - 1));
- length += WT_PTRDIFF(map, blk);
-
- /* XXX proxy for "am I doing a scan?" -- manual read-ahead */
- if (F_ISSET(session, WT_SESSION_READ_WONT_NEED)) {
- /* Read in 2MB blocks every 1MB of data. */
- if (((uintptr_t)((uint8_t *)blk + length) &
- (uintptr_t)((1<<20) - 1)) < (uintptr_t)blk)
- return (0);
- length = WT_MIN(WT_MAX(20 * length, 2 << 20),
- WT_PTRDIFF((uint8_t *)bm->map + bm->maplen, blk));
- }
-
- /*
- * Manual pages aren't clear on whether alignment is required for the
- * size, so we will be conservative.
- */
- length &= ~(size_t)(conn->page_size - 1);
- if (length <= (size_t)conn->page_size)
- return (0);
-
- WT_SYSCALL(posix_madvise(blk, length, POSIX_MADV_WILLNEED), ret);
- if (ret == 0)
- return (0);
-
- WT_RET_MSG(session, ret,
- "%s: memory-map preload: posix_madvise: POSIX_MADV_WILLNEED",
- fh->name);
+ WT_BM *bm;
+ WT_CONNECTION_IMPL *conn;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+ void *blk;
+
+ WT_UNUSED(mapped_cookie);
+
+ session = (WT_SESSION_IMPL *)wt_session;
+
+ conn = S2C(session);
+ bm = S2BT(session)->bm;
+
+ /* Linux requires the address be aligned to a 4KB boundary. */
+ blk = (void *)((uintptr_t)map & ~(uintptr_t)(conn->page_size - 1));
+ length += WT_PTRDIFF(map, blk);
+
+ /* XXX proxy for "am I doing a scan?" -- manual read-ahead */
+ if (F_ISSET(session, WT_SESSION_READ_WONT_NEED)) {
+ /* Read in 2MB blocks every 1MB of data. */
+ if (((uintptr_t)((uint8_t *)blk + length) & (uintptr_t)((1 << 20) - 1)) < (uintptr_t)blk)
+ return (0);
+ length =
+ WT_MIN(WT_MAX(20 * length, 2 << 20), WT_PTRDIFF((uint8_t *)bm->map + bm->maplen, blk));
+ }
+
+ /*
+ * Manual pages aren't clear on whether alignment is required for the size, so we will be
+ * conservative.
+ */
+ length &= ~(size_t)(conn->page_size - 1);
+ if (length <= (size_t)conn->page_size)
+ return (0);
+
+ WT_SYSCALL(posix_madvise(blk, length, POSIX_MADV_WILLNEED), ret);
+ if (ret == 0)
+ return (0);
+
+ WT_RET_MSG(
+ session, ret, "%s: memory-map preload: posix_madvise: POSIX_MADV_WILLNEED", fh->name);
}
#endif
#ifdef HAVE_POSIX_MADVISE
/*
* __wt_posix_map_discard --
- * Discard a chunk of the memory map.
+ * Discard a chunk of the memory map.
*/
int
-__wt_posix_map_discard(WT_FILE_HANDLE *fh,
- WT_SESSION *wt_session, void *map, size_t length, void *mapped_cookie)
+__wt_posix_map_discard(
+ WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *map, size_t length, void *mapped_cookie)
{
- WT_CONNECTION_IMPL *conn;
- WT_DECL_RET;
- WT_SESSION_IMPL *session;
- void *blk;
+ WT_CONNECTION_IMPL *conn;
+ WT_DECL_RET;
+ WT_SESSION_IMPL *session;
+ void *blk;
- WT_UNUSED(mapped_cookie);
+ WT_UNUSED(mapped_cookie);
- session = (WT_SESSION_IMPL *)wt_session;
- conn = S2C(session);
+ session = (WT_SESSION_IMPL *)wt_session;
+ conn = S2C(session);
- /* Linux requires the address be aligned to a 4KB boundary. */
- blk = (void *)((uintptr_t)map & ~(uintptr_t)(conn->page_size - 1));
- length += WT_PTRDIFF(map, blk);
+ /* Linux requires the address be aligned to a 4KB boundary. */
+ blk = (void *)((uintptr_t)map & ~(uintptr_t)(conn->page_size - 1));
+ length += WT_PTRDIFF(map, blk);
- WT_SYSCALL(posix_madvise(blk, length, POSIX_MADV_DONTNEED), ret);
- if (ret == 0)
- return (0);
+ WT_SYSCALL(posix_madvise(blk, length, POSIX_MADV_DONTNEED), ret);
+ if (ret == 0)
+ return (0);
- WT_RET_MSG(session, ret,
- "%s: memory-map discard: posix_madvise: POSIX_MADV_DONTNEED",
- fh->name);
+ WT_RET_MSG(
+ session, ret, "%s: memory-map discard: posix_madvise: POSIX_MADV_DONTNEED", fh->name);
}
#endif
/*
* __wt_posix_unmap --
- * Remove a memory mapping.
+ * Remove a memory mapping.
*/
int
-__wt_posix_unmap(WT_FILE_HANDLE *fh, WT_SESSION *wt_session,
- void *mapped_region, size_t len, void *mapped_cookie)
+__wt_posix_unmap(
+ WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_region, size_t len, void *mapped_cookie)
{
- WT_SESSION_IMPL *session;
+ WT_SESSION_IMPL *session;
- WT_UNUSED(mapped_cookie);
+ WT_UNUSED(mapped_cookie);
- session = (WT_SESSION_IMPL *)wt_session;
+ session = (WT_SESSION_IMPL *)wt_session;
- __wt_verbose(session, WT_VERB_HANDLEOPS,
- "%s: memory-unmap: %" WT_SIZET_FMT " bytes", fh->name, len);
+ __wt_verbose(
+ session, WT_VERB_HANDLEOPS, "%s: memory-unmap: %" WT_SIZET_FMT " bytes", fh->name, len);
- if (munmap(mapped_region, len) == 0)
- return (0);
+ if (munmap(mapped_region, len) == 0)
+ return (0);
- WT_RET_MSG(session, __wt_errno(), "%s: memory-unmap: munmap", fh->name);
+ WT_RET_MSG(session, __wt_errno(), "%s: memory-unmap: munmap", fh->name);
}