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