1 /*-
2 * Copyright (c) 2014-2018 MongoDB, Inc.
3 * Copyright (c) 2008-2014 WiredTiger, Inc.
4 * All rights reserved.
5 *
6 * See the file LICENSE for redistribution information.
7 */
8
9 #include "wt_internal.h"
10
11 /*
12 * __wt_win_map --
13 * Map a file into memory.
14 */
15 int
__wt_win_map(WT_FILE_HANDLE * file_handle,WT_SESSION * wt_session,void * mapped_regionp,size_t * lenp,void * mapped_cookiep)16 __wt_win_map(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session,
17 void *mapped_regionp, size_t *lenp, void *mapped_cookiep)
18 {
19 DWORD windows_error;
20 WT_FILE_HANDLE_WIN *win_fh;
21 WT_SESSION_IMPL *session;
22 size_t len;
23 wt_off_t file_size;
24 void *map, *mapped_cookie;
25
26 win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
27 session = (WT_SESSION_IMPL *)wt_session;
28
29 /*
30 * There's no locking here to prevent the underlying file from changing
31 * underneath us, our caller needs to ensure consistency of the mapped
32 * region vs. any other file activity.
33 */
34 WT_RET(__wt_win_fs_size(file_handle->file_system,
35 wt_session, file_handle->name, &file_size));
36 len = (size_t)file_size;
37
38 __wt_verbose(session, WT_VERB_HANDLEOPS,
39 "%s: memory-map: %" WT_SIZET_FMT " bytes", file_handle->name, len);
40
41 mapped_cookie = CreateFileMappingW(
42 win_fh->filehandle, NULL, PAGE_READONLY, 0, 0, NULL);
43 if (mapped_cookie == NULL) {
44 windows_error = __wt_getlasterror();
45 __wt_errx(session,
46 "%s: memory-map: CreateFileMappingW: %s",
47 file_handle->name,
48 __wt_formatmessage(session, windows_error));
49 return (__wt_map_windows_error(windows_error));
50 }
51
52 if ((map =
53 MapViewOfFile(mapped_cookie, FILE_MAP_READ, 0, 0, len)) == NULL) {
54 /* Retrieve the error before cleaning up. */
55 windows_error = __wt_getlasterror();
56
57 (void)CloseHandle(mapped_cookie);
58
59 __wt_errx(session,
60 "%s: memory-map: MapViewOfFile: %s",
61 file_handle->name,
62 __wt_formatmessage(session, windows_error));
63 return (__wt_map_windows_error(windows_error));
64 }
65
66 *(void **)mapped_cookiep = mapped_cookie;
67 *(void **)mapped_regionp = map;
68 *lenp = len;
69 return (0);
70 }
71
72 /*
73 * __wt_win_unmap --
74 * Remove a memory mapping.
75 */
76 int
__wt_win_unmap(WT_FILE_HANDLE * file_handle,WT_SESSION * wt_session,void * mapped_region,size_t length,void * mapped_cookie)77 __wt_win_unmap(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session,
78 void *mapped_region, size_t length, void *mapped_cookie)
79 {
80 DWORD windows_error;
81 WT_DECL_RET;
82 WT_FILE_HANDLE_WIN *win_fh;
83 WT_SESSION_IMPL *session;
84
85 win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
86 session = (WT_SESSION_IMPL *)wt_session;
87
88 __wt_verbose(session, WT_VERB_HANDLEOPS,
89 "%s: memory-unmap: %" WT_SIZET_FMT " bytes",
90 file_handle->name, length);
91
92 if (UnmapViewOfFile(mapped_region) == 0) {
93 windows_error = __wt_getlasterror();
94 __wt_errx(session,
95 "%s: memory-unmap: UnmapViewOfFile: %s",
96 file_handle->name,
97 __wt_formatmessage(session, windows_error));
98 ret = __wt_map_windows_error(windows_error);
99 }
100
101 if (CloseHandle(*(void **)mapped_cookie) == 0) {
102 windows_error = __wt_getlasterror();
103 __wt_errx(session,
104 "%s: memory-unmap: CloseHandle: %s",
105 file_handle->name,
106 __wt_formatmessage(session, windows_error));
107 ret = __wt_map_windows_error(windows_error);
108 }
109
110 return (ret);
111 }
112