summaryrefslogtreecommitdiff
path: root/src/os_posix/os_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os_posix/os_map.c')
-rw-r--r--src/os_posix/os_map.c118
1 files changed, 46 insertions, 72 deletions
diff --git a/src/os_posix/os_map.c b/src/os_posix/os_map.c
index de28891ffd1..7fde4037250 100644
--- a/src/os_posix/os_map.c
+++ b/src/os_posix/os_map.c
@@ -13,23 +13,26 @@
* Map a file into memory.
*/
int
-__wt_posix_map(WT_SESSION_IMPL *session,
- WT_FH *fh, void *mapp, size_t *lenp, void **mappingcookie)
+__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;
size_t len;
wt_off_t file_size;
void *map;
- WT_UNUSED(mappingcookie);
+ WT_UNUSED(mapped_cookiep);
- WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_IN_MEMORY));
+ 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 (fh->direct_io)
+ if (pfh->direct_io)
return (ENOTSUP);
/*
@@ -37,7 +40,7 @@ __wt_posix_map(WT_SESSION_IMPL *session,
* underneath us, our caller needs to ensure consistency of the mapped
* region vs. any other file activity.
*/
- WT_RET(__wt_filesize(session, fh, &file_size));
+ WT_RET(fh->size(fh, wt_session, &file_size));
len = (size_t)file_size;
(void)__wt_verbose(session, WT_VERB_HANDLEOPS,
@@ -49,43 +52,48 @@ __wt_posix_map(WT_SESSION_IMPL *session,
MAP_NOCORE |
#endif
MAP_PRIVATE,
- fh->fd, (wt_off_t)0)) == MAP_FAILED)
+ pfh->fd, (wt_off_t)0)) == MAP_FAILED)
WT_RET_MSG(session,
__wt_errno(), "%s: memory-map: mmap", fh->name);
- *(void **)mapp = map;
+ *(void **)mapped_regionp = map;
*lenp = len;
return (0);
}
#ifdef HAVE_POSIX_MADVISE
/*
- * __posix_map_preload_madvise --
+ * __wt_posix_map_preload --
* Cause a section of a memory map to be faulted in.
*/
-static int
-__posix_map_preload_madvise(
- WT_SESSION_IMPL *session, WT_FH *fh, const void *p, size_t size)
+int
+__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)p & ~(uintptr_t)(conn->page_size - 1));
- size += WT_PTRDIFF(p, blk);
+ 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_NO_CACHE)) {
/* Read in 2MB blocks every 1MB of data. */
- if (((uintptr_t)((uint8_t *)blk + size) &
+ if (((uintptr_t)((uint8_t *)blk + length) &
(uintptr_t)((1<<20) - 1)) < (uintptr_t)blk)
return (0);
- size = WT_MIN(WT_MAX(20 * size, 2 << 20),
+ length = WT_MIN(WT_MAX(20 * length, 2 << 20),
WT_PTRDIFF((uint8_t *)bm->map + bm->maplen, blk));
}
@@ -93,10 +101,10 @@ __posix_map_preload_madvise(
* Manual pages aren't clear on whether alignment is required for the
* size, so we will be conservative.
*/
- size &= ~(size_t)(conn->page_size - 1);
+ length &= ~(size_t)(conn->page_size - 1);
- if (size <= (size_t)conn->page_size ||
- (ret = posix_madvise(blk, size, POSIX_MADV_WILLNEED)) == 0)
+ if (length <= (size_t)conn->page_size ||
+ (ret = posix_madvise(blk, length, POSIX_MADV_WILLNEED)) == 0)
return (0);
WT_RET_MSG(session, ret,
"%s: memory-map preload: posix_madvise: POSIX_MADV_WILLNEED",
@@ -104,46 +112,30 @@ __posix_map_preload_madvise(
}
#endif
-/*
- * __wt_posix_map_preload --
- * Cause a section of a memory map to be faulted in.
- */
-int
-__wt_posix_map_preload(
- WT_SESSION_IMPL *session, WT_FH *fh, const void *p, size_t size)
-{
- WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_IN_MEMORY));
-
-#ifdef HAVE_POSIX_MADVISE
- return (__posix_map_preload_madvise(session, fh, p, size));
-#else
- WT_UNUSED(fh);
- WT_UNUSED(p);
- WT_UNUSED(size);
- return (ENOTSUP);
-#endif
-}
-
#ifdef HAVE_POSIX_MADVISE
/*
- * __posix_map_discard_madvise --
+ * __wt_posix_map_discard --
* Discard a chunk of the memory map.
*/
-static int
-__posix_map_discard_madvise(
- WT_SESSION_IMPL *session, WT_FH *fh, void *p, size_t size)
+int
+__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_UNUSED(mapped_cookie);
+
+ session = (WT_SESSION_IMPL *)wt_session;
conn = S2C(session);
/* Linux requires the address be aligned to a 4KB boundary. */
- blk = (void *)((uintptr_t)p & ~(uintptr_t)(conn->page_size - 1));
- size += WT_PTRDIFF(p, blk);
+ blk = (void *)((uintptr_t)map & ~(uintptr_t)(conn->page_size - 1));
+ length += WT_PTRDIFF(map, blk);
- if ((ret = posix_madvise(blk, size, POSIX_MADV_DONTNEED)) == 0)
+ if ((ret = posix_madvise(blk, length, POSIX_MADV_DONTNEED)) == 0)
return (0);
WT_RET_MSG(session, ret,
"%s: memory-map discard: posix_madvise: POSIX_MADV_DONTNEED",
@@ -152,41 +144,23 @@ __posix_map_discard_madvise(
#endif
/*
- * __wt_posix_map_discard --
- * Discard a chunk of the memory map.
- */
-int
-__wt_posix_map_discard(
- WT_SESSION_IMPL *session, WT_FH *fh, void *p, size_t size)
-{
- WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_IN_MEMORY));
-
-#ifdef HAVE_POSIX_MADVISE
- return (__posix_map_discard_madvise(session, fh, p, size));
-#else
- WT_UNUSED(fh);
- WT_UNUSED(p);
- WT_UNUSED(size);
- return (ENOTSUP);
-#endif
-}
-
-/*
- * __wt_posix_map_unmap --
+ * __wt_posix_unmap --
* Remove a memory mapping.
*/
int
-__wt_posix_map_unmap(WT_SESSION_IMPL *session,
- WT_FH *fh, void *map, size_t len, void **mappingcookie)
+__wt_posix_unmap(WT_FILE_HANDLE *fh, WT_SESSION *wt_session,
+ void *mapped_region, size_t len, void *mapped_cookie)
{
- WT_UNUSED(mappingcookie);
+ WT_SESSION_IMPL *session;
+
+ WT_UNUSED(mapped_cookie);
- WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_IN_MEMORY));
+ session = (WT_SESSION_IMPL *)wt_session;
(void)__wt_verbose(session, WT_VERB_HANDLEOPS,
"%s: memory-unmap: %" WT_SIZET_FMT " bytes", fh->name, len);
- if (munmap(map, len) == 0)
+ if (munmap(mapped_region, len) == 0)
return (0);
WT_RET_MSG(session, __wt_errno(), "%s: memory-unmap: munmap", fh->name);