summaryrefslogtreecommitdiff
path: root/src/os_win/os_fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os_win/os_fs.c')
-rw-r--r--src/os_win/os_fs.c425
1 files changed, 212 insertions, 213 deletions
diff --git a/src/os_win/os_fs.c b/src/os_win/os_fs.c
index afe3a074374..318ff723829 100644
--- a/src/os_win/os_fs.c
+++ b/src/os_win/os_fs.c
@@ -9,34 +9,21 @@
#include "wt_internal.h"
/*
- * __win_directory_sync --
- * Flush a directory to ensure a file creation is durable.
- */
-static int
-__win_directory_sync(WT_SESSION_IMPL *session, const char *path)
-{
- WT_UNUSED(session);
- WT_UNUSED(path);
- return (0);
-}
-
-/*
- * __win_file_exist --
+ * __win_fs_exist --
* Return if the file exists.
*/
static int
-__win_file_exist(WT_SESSION_IMPL *session, const char *name, bool *existp)
+__win_fs_exist(WT_FILE_SYSTEM *file_system,
+ WT_SESSION *wt_session, const char *name, bool *existp)
{
WT_DECL_RET;
- char *path;
-
- WT_RET(__wt_filename(session, name, &path));
+ WT_SESSION_IMPL *session;
- ret = GetFileAttributesA(path);
+ WT_UNUSED(file_system);
- __wt_free(session, path);
+ session = (WT_SESSION_IMPL *)wt_session;
- if (ret != INVALID_FILE_ATTRIBUTES)
+ if (GetFileAttributesA(name) != INVALID_FILE_ATTRIBUTES)
*existp = true;
else
*existp = false;
@@ -45,142 +32,96 @@ __win_file_exist(WT_SESSION_IMPL *session, const char *name, bool *existp)
}
/*
- * __win_file_remove --
+ * __win_fs_remove --
* Remove a file.
*/
static int
-__win_file_remove(WT_SESSION_IMPL *session, const char *name)
+__win_fs_remove(
+ WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *name)
{
WT_DECL_RET;
- char *path;
+ WT_SESSION_IMPL *session;
-#ifdef HAVE_DIAGNOSTIC
- if (__wt_handle_search(session, name, false, NULL, NULL))
- WT_RET_MSG(session, EINVAL,
- "%s: file-remove: file has open handles", name);
-#endif
+ WT_UNUSED(file_system);
- WT_RET(__wt_filename(session, name, &path));
- name = path;
+ session = (WT_SESSION_IMPL *)wt_session;
- if (DeleteFileA(name) == FALSE) {
- ret = __wt_getlasterror();
- __wt_err(session, ret, "%s: file-remove: DeleteFileA", name);
- }
+ if (DeleteFileA(name) == FALSE)
+ WT_RET_MSG(session, __wt_getlasterror(),
+ "%s: file-remove: DeleteFileA", name);
- __wt_free(session, path);
- return (ret);
+ return (0);
}
/*
- * __win_file_rename --
+ * __win_fs_rename --
* Rename a file.
*/
static int
-__win_file_rename(WT_SESSION_IMPL *session, const char *from, const char *to)
+__win_fs_rename(WT_FILE_SYSTEM *file_system,
+ WT_SESSION *wt_session, const char *from, const char *to)
{
WT_DECL_RET;
- char *from_path, *to_path;
+ WT_SESSION_IMPL *session;
-#ifdef HAVE_DIAGNOSTIC
- if (__wt_handle_search(session, from, false, NULL, NULL))
- WT_RET_MSG(session, EINVAL,
- "%s: file-rename: file has open handles", from);
- if (__wt_handle_search(session, to, false, NULL, NULL))
- WT_RET_MSG(session, EINVAL,
- "%s: file-rename: file has open handles", to);
-#endif
+ WT_UNUSED(file_system);
- from_path = to_path = NULL;
- WT_ERR(__wt_filename(session, from, &from_path));
- from = from_path;
- WT_ERR(__wt_filename(session, to, &to_path));
- to = to_path;
+ session = (WT_SESSION_IMPL *)wt_session;
/*
* Check if file exists since Windows does not override the file if
* it exists.
*/
if (GetFileAttributesA(to) != INVALID_FILE_ATTRIBUTES)
- if (DeleteFileA(to) == FALSE) {
- ret = __wt_getlasterror();
- __wt_err(session, ret,
+ if (DeleteFileA(to) == FALSE)
+ WT_RET_MSG(session, __wt_getlasterror(),
"%s to %s: file-rename: rename", from, to);
- }
- if (ret == 0 && MoveFileA(from, to) == FALSE) {
- ret = __wt_getlasterror();
- __wt_err(session, ret,
+ if (MoveFileA(from, to) == FALSE)
+ WT_RET_MSG(session, __wt_getlasterror(),
"%s to %s: file-rename: rename", from, to);
- }
-err: __wt_free(session, from_path);
- __wt_free(session, to_path);
- return (ret);
+ return (0);
}
/*
- * __win_file_size --
+ * __wt_win_fs_size --
* Get the size of a file in bytes, by file name.
*/
-static int
-__win_file_size(
- WT_SESSION_IMPL *session, const char *name, bool silent, wt_off_t *sizep)
+int
+__wt_win_fs_size(WT_FILE_SYSTEM *file_system,
+ WT_SESSION *wt_session, const char *name, wt_off_t *sizep)
{
WIN32_FILE_ATTRIBUTE_DATA data;
- WT_DECL_RET;
- char *path;
-
- WT_RET(__wt_filename(session, name, &path));
+ WT_SESSION_IMPL *session;
- ret = GetFileAttributesExA(path, GetFileExInfoStandard, &data);
+ WT_UNUSED(file_system);
- __wt_free(session, path);
+ session = (WT_SESSION_IMPL *)wt_session;
- if (ret != 0) {
+ if (GetFileAttributesExA(name, GetFileExInfoStandard, &data) != 0) {
*sizep =
((int64_t)data.nFileSizeHigh << 32) | data.nFileSizeLow;
return (0);
}
- /*
- * Some callers of this function expect failure if the file doesn't
- * exist, and don't want an error message logged.
- */
- ret = __wt_getlasterror();
- if (!silent)
- WT_RET_MSG(session, ret,
- "%s: file-size: GetFileAttributesEx", name);
- return (ret);
-}
-
-/*
- * __win_handle_allocate_configure --
- * Configure fallocate behavior for a file handle.
- */
-static void
-__win_handle_allocate_configure(WT_SESSION_IMPL *session, WT_FH *fh)
-{
- WT_UNUSED(session);
-
- /*
- * fallocate on Windows would be implemented using SetEndOfFile, which
- * can also truncate the file. WiredTiger expects fallocate to ignore
- * requests to truncate the file which Windows does not do, so we don't
- * support the call.
- */
- fh->fallocate_available = WT_FALLOCATE_NOT_AVAILABLE;
- fh->fallocate_requires_locking = false;
+ WT_RET_MSG(session, __wt_getlasterror(),
+ "%s: file-size: GetFileAttributesEx", name);
}
/*
- * __win_handle_close --
+ * __win_file_close --
* ANSI C close.
*/
static int
-__win_handle_close(WT_SESSION_IMPL *session, WT_FH *fh)
+__win_file_close(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session)
{
WT_DECL_RET;
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
+
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
/*
* Close the primary and secondary handles.
@@ -189,31 +130,40 @@ __win_handle_close(WT_SESSION_IMPL *session, WT_FH *fh)
* flushing, as it's not necessary (or possible) to flush a directory
* on Windows. Confirm the file handle is open before closing it.
*/
- if (fh->filehandle != INVALID_HANDLE_VALUE &&
- CloseHandle(fh->filehandle) == 0) {
+ if (win_fh->filehandle != INVALID_HANDLE_VALUE &&
+ CloseHandle(win_fh->filehandle) == 0) {
ret = __wt_getlasterror();
__wt_err(session, ret,
- "%s: handle-close: CloseHandle", fh->name);
+ "%s: handle-close: CloseHandle", file_handle->name);
}
- if (fh->filehandle_secondary != INVALID_HANDLE_VALUE &&
- CloseHandle(fh->filehandle_secondary) == 0) {
+ if (win_fh->filehandle_secondary != INVALID_HANDLE_VALUE &&
+ CloseHandle(win_fh->filehandle_secondary) == 0) {
ret = __wt_getlasterror();
__wt_err(session, ret,
- "%s: handle-close: secondary: CloseHandle", fh->name);
+ "%s: handle-close: secondary: CloseHandle",
+ file_handle->name);
}
+ __wt_free(session, file_handle->name);
+ __wt_free(session, win_fh);
return (ret);
}
/*
- * __win_handle_lock --
+ * __win_file_lock --
* Lock/unlock a file.
*/
static int
-__win_handle_lock(WT_SESSION_IMPL *session, WT_FH *fh, bool lock)
+__win_file_lock(
+ WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, bool lock)
{
WT_DECL_RET;
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
+
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
/*
* WiredTiger requires this function be able to acquire locks past
@@ -231,37 +181,42 @@ __win_handle_lock(WT_SESSION_IMPL *session, WT_FH *fh, bool lock)
* This is useful to coordinate adding records to the end of a file.
*/
if (lock) {
- if (LockFile(fh->filehandle, 0, 0, 1, 0) == FALSE) {
+ if (LockFile(win_fh->filehandle, 0, 0, 1, 0) == FALSE) {
ret = __wt_getlasterror();
__wt_err(session, ret,
- "%s: handle-lock: LockFile", fh->name);
+ "%s: handle-lock: LockFile", file_handle->name);
}
} else
- if (UnlockFile(fh->filehandle, 0, 0, 1, 0) == FALSE) {
+ if (UnlockFile(win_fh->filehandle, 0, 0, 1, 0) == FALSE) {
ret = __wt_getlasterror();
__wt_err(session, ret,
- "%s: handle-lock: UnlockFile", fh->name);
+ "%s: handle-lock: UnlockFile", file_handle->name);
}
return (ret);
}
/*
- * __win_handle_read --
+ * __win_file_read --
* Read a chunk.
*/
static int
-__win_handle_read(
- WT_SESSION_IMPL *session, WT_FH *fh, wt_off_t offset, size_t len, void *buf)
+__win_file_read(WT_FILE_HANDLE *file_handle,
+ WT_SESSION *wt_session, wt_off_t offset, size_t len, void *buf)
{
DWORD chunk, nr;
uint8_t *addr;
OVERLAPPED overlapped = { 0 };
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
+
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
nr = 0;
/* Assert direct I/O is aligned and a multiple of the alignment. */
WT_ASSERT(session,
- !fh->direct_io ||
+ !win_fh->direct_io ||
S2C(session)->buffer_alignment == 0 ||
(!((uintptr_t)buf &
(uintptr_t)(S2C(session)->buffer_alignment - 1)) &&
@@ -274,42 +229,54 @@ __win_handle_read(
overlapped.Offset = UINT32_MAX & offset;
overlapped.OffsetHigh = UINT32_MAX & (offset >> 32);
- if (!ReadFile(fh->filehandle, addr, chunk, &nr, &overlapped))
+ if (!ReadFile(
+ win_fh->filehandle, addr, chunk, &nr, &overlapped))
WT_RET_MSG(session,
__wt_getlasterror(),
"%s: handle-read: ReadFile: failed to read %lu "
"bytes at offset %" PRIuMAX,
- fh->name, chunk, (uintmax_t)offset);
+ file_handle->name, chunk, (uintmax_t)offset);
}
return (0);
}
/*
- * __win_handle_size --
+ * __win_file_size --
* Get the size of a file in bytes, by file handle.
*/
static int
-__win_handle_size(WT_SESSION_IMPL *session, WT_FH *fh, wt_off_t *sizep)
+__win_file_size(
+ WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, wt_off_t *sizep)
{
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
LARGE_INTEGER size;
- if (GetFileSizeEx(fh->filehandle, &size) != 0) {
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
+
+ if (GetFileSizeEx(win_fh->filehandle, &size) != 0) {
*sizep = size.QuadPart;
return (0);
}
- WT_RET_MSG(session,
- __wt_getlasterror(), "%s: handle-size: GetFileSizeEx", fh->name);
+ WT_RET_MSG(session, __wt_getlasterror(),
+ "%s: handle-size: GetFileSizeEx", file_handle->name);
}
/*
- * __win_handle_sync --
+ * __win_file_sync --
* MSVC fsync.
*/
static int
-__win_handle_sync(WT_SESSION_IMPL *session, WT_FH *fh, bool block)
+__win_file_sync(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session)
{
WT_DECL_RET;
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
+
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
/*
* We don't open Windows system handles when opening directories
@@ -317,72 +284,79 @@ __win_handle_sync(WT_SESSION_IMPL *session, WT_FH *fh, bool block)
* a directory on Windows. Confirm the file handle is set before
* attempting to sync it.
*/
- if (fh->filehandle == INVALID_HANDLE_VALUE)
+ if (win_fh->filehandle == INVALID_HANDLE_VALUE)
return (0);
- /*
- * Callers attempting asynchronous flush handle ENOTSUP returns,
- * and won't make further attempts.
- */
- if (!block)
- return (ENOTSUP);
-
- if (FlushFileBuffers(fh->filehandle) == FALSE) {
+ if (FlushFileBuffers(win_fh->filehandle) == FALSE) {
ret = __wt_getlasterror();
WT_RET_MSG(session, ret,
- "%s handle-sync: FlushFileBuffers error", fh->name);
+ "%s handle-sync: FlushFileBuffers error",
+ file_handle->name);
}
return (0);
}
/*
- * __win_handle_truncate --
+ * __win_file_truncate --
* Truncate a file.
*/
static int
-__win_handle_truncate(WT_SESSION_IMPL *session, WT_FH *fh, wt_off_t len)
+__win_file_truncate(
+ WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, wt_off_t len)
{
WT_DECL_RET;
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
LARGE_INTEGER largeint;
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
+
largeint.QuadPart = len;
- if (fh->filehandle_secondary == INVALID_HANDLE_VALUE)
+ if (win_fh->filehandle_secondary == INVALID_HANDLE_VALUE)
WT_RET_MSG(session, EINVAL,
- "%s: handle-truncate: read-only", fh->name);
+ "%s: handle-truncate: read-only", file_handle->name);
if (SetFilePointerEx(
- fh->filehandle_secondary, largeint, NULL, FILE_BEGIN) == FALSE)
+ win_fh->filehandle_secondary, largeint, NULL, FILE_BEGIN) == FALSE)
WT_RET_MSG(session, __wt_getlasterror(),
- "%s: handle-truncate: SetFilePointerEx", fh->name);
+ "%s: handle-truncate: SetFilePointerEx",
+ file_handle->name);
- if (SetEndOfFile(fh->filehandle_secondary) == FALSE) {
+ if (SetEndOfFile(win_fh->filehandle_secondary) == FALSE) {
if (GetLastError() == ERROR_USER_MAPPED_FILE)
return (EBUSY);
WT_RET_MSG(session, __wt_getlasterror(),
- "%s: handle-truncate: SetEndOfFile error", fh->name);
+ "%s: handle-truncate: SetEndOfFile error",
+ file_handle->name);
}
return (0);
}
/*
- * __win_handle_write --
+ * __win_file_write --
* Write a chunk.
*/
static int
-__win_handle_write(WT_SESSION_IMPL *session,
- WT_FH *fh, wt_off_t offset, size_t len, const void *buf)
+__win_file_write(WT_FILE_HANDLE *file_handle,
+ WT_SESSION *wt_session, wt_off_t offset, size_t len, const void *buf)
{
DWORD chunk;
DWORD nw;
const uint8_t *addr;
OVERLAPPED overlapped = { 0 };
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
+
+ win_fh = (WT_FILE_HANDLE_WIN *)file_handle;
+ session = (WT_SESSION_IMPL *)wt_session;
nw = 0;
/* Assert direct I/O is aligned and a multiple of the alignment. */
WT_ASSERT(session,
- !fh->direct_io ||
+ !win_fh->direct_io ||
S2C(session)->buffer_alignment == 0 ||
(!((uintptr_t)buf &
(uintptr_t)(S2C(session)->buffer_alignment - 1)) &&
@@ -395,36 +369,47 @@ __win_handle_write(WT_SESSION_IMPL *session,
overlapped.Offset = UINT32_MAX & offset;
overlapped.OffsetHigh = UINT32_MAX & (offset >> 32);
- if (!WriteFile(fh->filehandle, addr, chunk, &nw, &overlapped))
+ if (!WriteFile(
+ win_fh->filehandle, addr, chunk, &nw, &overlapped))
WT_RET_MSG(session, __wt_getlasterror(),
"%s: handle-write: WriteFile: failed to write %lu "
"bytes at offset %" PRIuMAX,
- fh->name, chunk, (uintmax_t)offset);
+ file_handle->name, chunk, (uintmax_t)offset);
}
return (0);
}
/*
- * __win_file_open --
+ * __win_open_file --
* Open a file handle.
*/
static int
-__win_file_open(WT_SESSION_IMPL *session,
- WT_FH *fh, const char *name, uint32_t file_type, uint32_t flags)
+__win_open_file(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session,
+ const char *name, WT_OPEN_FILE_TYPE file_type, uint32_t flags,
+ WT_FILE_HANDLE **file_handlep)
{
DWORD dwCreationDisposition;
- HANDLE filehandle, filehandle_secondary;
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
+ WT_FILE_HANDLE *file_handle;
+ WT_FILE_HANDLE_WIN *win_fh;
+ WT_SESSION_IMPL *session;
int desired_access, f;
- bool direct_io;
+ WT_UNUSED(file_system);
+
+ *file_handlep = NULL;
+
+ session = (WT_SESSION_IMPL *)wt_session;
conn = S2C(session);
- direct_io = false;
+
+ WT_RET(__wt_calloc_one(session, &win_fh));
+
+ win_fh->direct_io = false;
/* Set up error handling. */
- fh->filehandle = fh->filehandle_secondary =
- filehandle = filehandle_secondary = INVALID_HANDLE_VALUE;
+ win_fh->filehandle =
+ win_fh->filehandle_secondary = INVALID_HANDLE_VALUE;
/*
* Opening a file handle on a directory is only to support filesystems
@@ -432,7 +417,7 @@ __win_file_open(WT_SESSION_IMPL *session,
* require that functionality: create an empty WT_FH structure with
* invalid handles.
*/
- if (file_type == WT_FILE_TYPE_DIRECTORY)
+ if (file_type == WT_OPEN_FILE_TYPE_DIRECTORY)
goto directory_open;
desired_access = GENERIC_READ;
@@ -460,33 +445,33 @@ __win_file_open(WT_SESSION_IMPL *session,
/* Direct I/O. */
if (LF_ISSET(WT_OPEN_DIRECTIO)) {
f |= FILE_FLAG_NO_BUFFERING;
- fh->direct_io = true;
+ win_fh->direct_io = true;
}
/* FILE_FLAG_WRITE_THROUGH does not require aligned buffers */
if (FLD_ISSET(conn->write_through, file_type))
f |= FILE_FLAG_WRITE_THROUGH;
- if (file_type == WT_FILE_TYPE_LOG &&
+ if (file_type == WT_OPEN_FILE_TYPE_LOG &&
FLD_ISSET(conn->txn_logsync, WT_LOG_DSYNC))
f |= FILE_FLAG_WRITE_THROUGH;
/* Disable read-ahead on trees: it slows down random read workloads. */
- if (file_type == WT_FILE_TYPE_DATA)
+ if (file_type == WT_OPEN_FILE_TYPE_DATA)
f |= FILE_FLAG_RANDOM_ACCESS;
- filehandle = CreateFileA(name, desired_access,
+ win_fh->filehandle = CreateFileA(name, desired_access,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, dwCreationDisposition, f, NULL);
- if (filehandle == INVALID_HANDLE_VALUE) {
+ if (win_fh->filehandle == INVALID_HANDLE_VALUE) {
if (LF_ISSET(WT_OPEN_CREATE) &&
GetLastError() == ERROR_FILE_EXISTS)
- filehandle = CreateFileA(name, desired_access,
+ win_fh->filehandle = CreateFileA(name, desired_access,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, f, NULL);
- if (filehandle == INVALID_HANDLE_VALUE)
+ if (win_fh->filehandle == INVALID_HANDLE_VALUE)
WT_ERR_MSG(session, __wt_getlasterror(),
- direct_io ?
+ win_fh->direct_io ?
"%s: handle-open: CreateFileA: failed with direct "
"I/O configured, some filesystem types do not "
"support direct I/O" :
@@ -499,74 +484,88 @@ __win_file_open(WT_SESSION_IMPL *session,
* pointer.
*/
if (!LF_ISSET(WT_OPEN_READONLY)) {
- filehandle_secondary = CreateFileA(name, desired_access,
+ win_fh->filehandle_secondary = CreateFileA(name, desired_access,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, f, NULL);
- if (filehandle_secondary == INVALID_HANDLE_VALUE)
+ if (win_fh->filehandle_secondary == INVALID_HANDLE_VALUE)
WT_ERR_MSG(session, __wt_getlasterror(),
"%s: handle-open: CreateFileA: secondary", name);
}
- /* Configure fallocate/posix_fallocate calls. */
- __win_handle_allocate_configure(session, fh);
-
directory_open:
- fh->filehandle = filehandle;
- fh->filehandle_secondary = filehandle_secondary;
-
- fh->fh_close = __win_handle_close;
- fh->fh_lock = __win_handle_lock;
- fh->fh_map = __wt_win_map;
- fh->fh_map_discard = __wt_win_map_discard;
- fh->fh_map_preload = __wt_win_map_preload;
- fh->fh_map_unmap = __wt_win_map_unmap;
- fh->fh_read = __win_handle_read;
- fh->fh_size = __win_handle_size;
- fh->fh_sync = __win_handle_sync;
- fh->fh_truncate = __win_handle_truncate;
- fh->fh_write = __win_handle_write;
+ /* Initialize public information. */
+ file_handle = (WT_FILE_HANDLE *)win_fh;
+ WT_ERR(__wt_strdup(session, name, &file_handle->name));
- return (0);
+ file_handle->close = __win_file_close;
+ file_handle->lock = __win_file_lock;
+#ifdef WORDS_BIGENDIAN
+ /*
+ * The underlying objects are little-endian, mapping objects isn't
+ * currently supported on big-endian systems.
+ */
+#else
+ file_handle->map = __wt_win_map;
+ file_handle->map_discard = NULL;
+ file_handle->map_preload = NULL;
+ file_handle->unmap = __wt_win_unmap;
+#endif
+ file_handle->read = __win_file_read;
+ file_handle->size = __win_file_size;
+ file_handle->sync = __win_file_sync;
+ file_handle->truncate = __win_file_truncate;
+ file_handle->write = __win_file_write;
+
+ *file_handlep = file_handle;
-err: if (filehandle != INVALID_HANDLE_VALUE)
- (void)CloseHandle(filehandle);
- if (filehandle_secondary != INVALID_HANDLE_VALUE)
- (void)CloseHandle(filehandle_secondary);
+ return (0);
+err: WT_TRET(__win_file_close((WT_FILE_HANDLE *)win_fh, wt_session));
return (ret);
}
/*
- * __wt_os_win --
- * Initialize a MSVC configuration.
+ * __win_terminate --
+ * Discard a Windows configuration.
*/
-int
-__wt_os_win(WT_SESSION_IMPL *session)
+static int
+__win_terminate(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session)
{
- WT_CONNECTION_IMPL *conn;
-
- conn = S2C(session);
+ WT_SESSION_IMPL *session;
- /* Initialize the POSIX jump table. */
- conn->file_directory_list = __wt_win_directory_list;
- conn->file_directory_sync = __win_directory_sync;
- conn->file_exist = __win_file_exist;
- conn->file_open = __win_file_open;
- conn->file_remove = __win_file_remove;
- conn->file_rename = __win_file_rename;
- conn->file_size = __win_file_size;
+ session = (WT_SESSION_IMPL *)wt_session;
+ __wt_free(session, file_system);
return (0);
}
/*
- * __wt_os_win_cleanup --
- * Discard a POSIX configuration.
+ * __wt_os_win --
+ * Initialize a MSVC configuration.
*/
int
-__wt_os_win_cleanup(WT_SESSION_IMPL *session)
+__wt_os_win(WT_SESSION_IMPL *session)
{
- WT_UNUSED(session);
+ WT_CONNECTION_IMPL *conn;
+ WT_FILE_SYSTEM *file_system;
+
+ conn = S2C(session);
+
+ WT_RET(__wt_calloc_one(session, &file_system));
+
+ /* Initialize the Windows jump table. */
+ file_system->directory_list = __wt_win_directory_list;
+ file_system->directory_list_free = __wt_win_directory_list_free;
+ file_system->directory_sync = NULL;
+ file_system->exist = __win_fs_exist;
+ file_system->open_file = __win_open_file;
+ file_system->remove = __win_fs_remove;
+ file_system->rename = __win_fs_rename;
+ file_system->size = __wt_win_fs_size;
+ file_system->terminate = __win_terminate;
+
+ /* Switch it into place. */
+ conn->file_system = file_system;
return (0);
}