1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
/*-
* Copyright (c) 2014-2016 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
* See the file LICENSE for redistribution information.
*/
/*
* Number of directory entries can grow dynamically.
*/
#define WT_DIR_ENTRY 32
#define WT_DIRLIST_EXCLUDE 0x1 /* Exclude files matching prefix */
#define WT_DIRLIST_INCLUDE 0x2 /* Include files matching prefix */
#define WT_SYSCALL_RETRY(call, ret) do { \
int __retry; \
for (__retry = 0; __retry < 10; ++__retry) { \
if ((call) == 0) { \
(ret) = 0; \
break; \
} \
switch ((ret) = __wt_errno()) { \
case 0: \
/* The call failed but didn't set errno. */ \
(ret) = WT_ERROR; \
break; \
case EAGAIN: \
case EBUSY: \
case EINTR: \
case EIO: \
case EMFILE: \
case ENFILE: \
case ENOSPC: \
__wt_sleep(0L, 50000L); \
continue; \
default: \
break; \
} \
break; \
} \
} while (0)
#define WT_TIMEDIFF_NS(end, begin) \
(WT_BILLION * (uint64_t)((end).tv_sec - (begin).tv_sec) + \
(uint64_t)(end).tv_nsec - (uint64_t)(begin).tv_nsec)
#define WT_TIMEDIFF_US(end, begin) \
(WT_TIMEDIFF_NS((end), (begin)) / WT_THOUSAND)
#define WT_TIMEDIFF_MS(end, begin) \
(WT_TIMEDIFF_NS((end), (begin)) / WT_MILLION)
#define WT_TIMEDIFF_SEC(end, begin) \
(WT_TIMEDIFF_NS((end), (begin)) / WT_BILLION)
#define WT_TIMECMP(t1, t2) \
((t1).tv_sec < (t2).tv_sec ? -1 : \
(t1).tv_sec == (t2.tv_sec) ? \
(t1).tv_nsec < (t2).tv_nsec ? -1 : \
(t1).tv_nsec == (t2).tv_nsec ? 0 : 1 : 1)
/*
* The underlying OS calls return ENOTSUP if posix_fadvise functionality isn't
* available, but WiredTiger uses the POSIX flag names in the API. Use distinct
* values so the underlying code can distinguish.
*/
#ifndef POSIX_FADV_DONTNEED
#define POSIX_FADV_DONTNEED 0x01
#endif
#ifndef POSIX_FADV_WILLNEED
#define POSIX_FADV_WILLNEED 0x02
#endif
#define WT_OPEN_CREATE 0x001 /* Create is OK */
#define WT_OPEN_EXCLUSIVE 0x002 /* Exclusive open */
#define WT_OPEN_FIXED 0x004 /* Path isn't relative to home */
#define WT_OPEN_READONLY 0x008 /* Readonly open */
#define WT_STREAM_APPEND 0x010 /* Open a stream: append */
#define WT_STREAM_LINE_BUFFER 0x020 /* Line buffer the stream */
#define WT_STREAM_READ 0x040 /* Open a stream: read */
#define WT_STREAM_WRITE 0x080 /* Open a stream: write */
struct __wt_fh {
const char *name; /* File name */
uint64_t name_hash; /* Hash of name */
TAILQ_ENTRY(__wt_fh) q; /* List of open handles */
TAILQ_ENTRY(__wt_fh) hashq; /* Hashed list of handles */
u_int ref; /* Reference count */
/*
* Underlying file system handle support.
*/
#ifdef _WIN32
HANDLE filehandle; /* Windows file handle */
HANDLE filehandle_secondary; /* Windows file handle
for file size changes */
#else
int fd; /* POSIX file handle */
#endif
FILE *fp; /* ANSI C stdio handle */
/*
* Underlying in-memory handle support.
*/
size_t off; /* Read/write offset */
WT_ITEM buf; /* Data */
bool direct_io; /* O_DIRECT configured */
enum { /* file extend configuration */
WT_FALLOCATE_AVAILABLE,
WT_FALLOCATE_NOT_AVAILABLE,
WT_FALLOCATE_POSIX,
WT_FALLOCATE_STD,
WT_FALLOCATE_SYS } fallocate_available;
bool fallocate_requires_locking;
#define WT_FH_FLUSH_ON_CLOSE 0x01 /* Flush when closing */
#define WT_FH_IN_MEMORY 0x02 /* In-memory, don't remove */
uint32_t flags;
int (*fh_advise)(WT_SESSION_IMPL *, WT_FH *, wt_off_t, wt_off_t, int);
int (*fh_allocate)(WT_SESSION_IMPL *, WT_FH *, wt_off_t, wt_off_t);
int (*fh_close)(WT_SESSION_IMPL *, WT_FH *);
int (*fh_getc)(WT_SESSION_IMPL *, WT_FH *, int *);
int (*fh_lock)(WT_SESSION_IMPL *, WT_FH *, bool);
int (*fh_map)(WT_SESSION_IMPL *, WT_FH *, void *, size_t *, void **);
int (*fh_map_discard)(WT_SESSION_IMPL *, WT_FH *, void *, size_t);
int (*fh_map_preload)(WT_SESSION_IMPL *, WT_FH *, const void *, size_t);
int (*fh_map_unmap)(
WT_SESSION_IMPL *, WT_FH *, void *, size_t, void **);
int (*fh_printf)(WT_SESSION_IMPL *, WT_FH *, const char *, va_list);
int (*fh_read)(WT_SESSION_IMPL *, WT_FH *, wt_off_t, size_t, void *);
int (*fh_size)(WT_SESSION_IMPL *, WT_FH *, wt_off_t *);
int (*fh_sync)(WT_SESSION_IMPL *, WT_FH *, bool);
int (*fh_truncate)(WT_SESSION_IMPL *, WT_FH *, wt_off_t);
int (*fh_write)(
WT_SESSION_IMPL *, WT_FH *, wt_off_t, size_t, const void *);
};
|