summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/include/os.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/include/os.h')
-rw-r--r--src/third_party/wiredtiger/src/include/os.h289
1 files changed, 142 insertions, 147 deletions
diff --git a/src/third_party/wiredtiger/src/include/os.h b/src/third_party/wiredtiger/src/include/os.h
index 37e0799ef16..919edeec586 100644
--- a/src/third_party/wiredtiger/src/include/os.h
+++ b/src/third_party/wiredtiger/src/include/os.h
@@ -6,179 +6,174 @@
* See the file LICENSE for redistribution information.
*/
-#define WT_SYSCALL(call, ret) do { \
- /* \
- * A call returning 0 indicates success; any call where \
- * 0 is not the only successful return must provide an \
- * expression evaluating to 0 in all successful cases. \
- * \
- * XXX \
- * Casting the call's return to int is because CentOS 7.3.1611 \
- * complains about syscall returning a long and the loss of \
- * integer precision in the assignment to ret. The cast should \
- * be a no-op everywhere. \
- */ \
- if (((ret) = (int)(call)) == 0) \
- break; \
- /* \
- * The call's error was either returned by the call or \
- * is in errno, and there are cases where it depends on \
- * the software release as to which it is (for example, \
- * posix_fadvise on FreeBSD and OS X). Failing calls \
- * must either return a non-zero error value, or -1 if \
- * the error value is in errno. (The WiredTiger errno \
- * function returns WT_ERROR if errno is 0, which isn't \
- * ideal but won't discard the failure.) \
- */ \
- if ((ret) == -1) \
- (ret) = __wt_errno(); \
-} while (0)
-
-#define WT_RETRY_MAX 10
-
-#define WT_SYSCALL_RETRY(call, ret) do { \
- int __retry; \
- for (__retry = 0; __retry < WT_RETRY_MAX; ++__retry) { \
- WT_SYSCALL(call, ret); \
- switch (ret) { \
- 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_CLOCKDIFF_NS(end, begin) \
- (__wt_clock_to_nsec(end, begin))
-#define WT_CLOCKDIFF_US(end, begin) \
- (WT_CLOCKDIFF_NS(end, begin) / WT_THOUSAND)
-#define WT_CLOCKDIFF_MS(end, begin) \
- (WT_CLOCKDIFF_NS(end, begin) / WT_MILLION)
-#define WT_CLOCKDIFF_SEC(end, begin) \
- (WT_CLOCKDIFF_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)
+#define WT_SYSCALL(call, ret) \
+ do { \
+ /* \
+ * A call returning 0 indicates success; any call where \
+ * 0 is not the only successful return must provide an \
+ * expression evaluating to 0 in all successful cases. \
+ * \
+ * XXX \
+ * Casting the call's return to int is because CentOS 7.3.1611 \
+ * complains about syscall returning a long and the loss of \
+ * integer precision in the assignment to ret. The cast should \
+ * be a no-op everywhere. \
+ */ \
+ if (((ret) = (int)(call)) == 0) \
+ break; \
+ /* \
+ * The call's error was either returned by the call or \
+ * is in errno, and there are cases where it depends on \
+ * the software release as to which it is (for example, \
+ * posix_fadvise on FreeBSD and OS X). Failing calls \
+ * must either return a non-zero error value, or -1 if \
+ * the error value is in errno. (The WiredTiger errno \
+ * function returns WT_ERROR if errno is 0, which isn't \
+ * ideal but won't discard the failure.) \
+ */ \
+ if ((ret) == -1) \
+ (ret) = __wt_errno(); \
+ } while (0)
+
+#define WT_RETRY_MAX 10
+
+#define WT_SYSCALL_RETRY(call, ret) \
+ do { \
+ int __retry; \
+ for (__retry = 0; __retry < WT_RETRY_MAX; ++__retry) { \
+ WT_SYSCALL(call, ret); \
+ switch (ret) { \
+ 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_CLOCKDIFF_NS(end, begin) (__wt_clock_to_nsec(end, begin))
+#define WT_CLOCKDIFF_US(end, begin) (WT_CLOCKDIFF_NS(end, begin) / WT_THOUSAND)
+#define WT_CLOCKDIFF_MS(end, begin) (WT_CLOCKDIFF_NS(end, begin) / WT_MILLION)
+#define WT_CLOCKDIFF_SEC(end, begin) (WT_CLOCKDIFF_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)
/*
- * Macros to ensure a file handle is inserted or removed from both the main and
- * the hashed queue, used by connection-level and in-memory data structures.
+ * Macros to ensure a file handle is inserted or removed from both the main and the hashed queue,
+ * used by connection-level and in-memory data structures.
*/
-#define WT_FILE_HANDLE_INSERT(h, fh, bucket) do { \
- TAILQ_INSERT_HEAD(&(h)->fhqh, fh, q); \
- TAILQ_INSERT_HEAD(&(h)->fhhash[bucket], fh, hashq); \
-} while (0)
-
-#define WT_FILE_HANDLE_REMOVE(h, fh, bucket) do { \
- TAILQ_REMOVE(&(h)->fhqh, fh, q); \
- TAILQ_REMOVE(&(h)->fhhash[bucket], fh, hashq); \
-} while (0)
+#define WT_FILE_HANDLE_INSERT(h, fh, bucket) \
+ do { \
+ TAILQ_INSERT_HEAD(&(h)->fhqh, fh, q); \
+ TAILQ_INSERT_HEAD(&(h)->fhhash[bucket], fh, hashq); \
+ } while (0)
+
+#define WT_FILE_HANDLE_REMOVE(h, fh, bucket) \
+ do { \
+ TAILQ_REMOVE(&(h)->fhqh, fh, q); \
+ TAILQ_REMOVE(&(h)->fhhash[bucket], fh, hashq); \
+ } while (0)
struct __wt_fh {
- /*
- * There is a file name field in both the WT_FH and WT_FILE_HANDLE
- * structures, which isn't ideal. There would be compromises to keeping
- * a single copy: If it were in WT_FH, file systems could not access
- * the name field, if it were just in the WT_FILE_HANDLE internal
- * WiredTiger code would need to maintain a string inside a structure
- * that is owned by the user (since we care about the content of the
- * file name). Keeping two copies seems most reasonable.
- */
- const char *name; /* File name */
-
- uint64_t name_hash; /* hash of name */
- uint64_t last_sync; /* time of background fsync */
- volatile uint64_t written; /* written since fsync */
- TAILQ_ENTRY(__wt_fh) q; /* internal queue */
- TAILQ_ENTRY(__wt_fh) hashq; /* internal hash queue */
- u_int ref; /* reference count */
- WT_FS_OPEN_FILE_TYPE file_type; /* file type */
-
- WT_FILE_HANDLE *handle;
+ /*
+ * There is a file name field in both the WT_FH and WT_FILE_HANDLE structures, which isn't
+ * ideal. There would be compromises to keeping a single copy: If it were in WT_FH, file systems
+ * could not access the name field, if it were just in the WT_FILE_HANDLE internal WiredTiger
+ * code would need to maintain a string inside a structure that is owned by the user (since we
+ * care about the content of the file name). Keeping two copies seems most reasonable.
+ */
+ const char *name; /* File name */
+
+ uint64_t name_hash; /* hash of name */
+ uint64_t last_sync; /* time of background fsync */
+ volatile uint64_t written; /* written since fsync */
+ TAILQ_ENTRY(__wt_fh) q; /* internal queue */
+ TAILQ_ENTRY(__wt_fh) hashq; /* internal hash queue */
+ u_int ref; /* reference count */
+ WT_FS_OPEN_FILE_TYPE file_type; /* file type */
+
+ WT_FILE_HANDLE *handle;
};
#ifdef _WIN32
struct __wt_file_handle_win {
- WT_FILE_HANDLE iface;
-
- /*
- * Windows specific file handle fields
- */
- HANDLE filehandle; /* Windows file handle */
- HANDLE filehandle_secondary; /* Windows file handle
- for file size changes */
- bool direct_io; /* O_DIRECT configured */
+ WT_FILE_HANDLE iface;
+
+ /*
+ * Windows specific file handle fields
+ */
+ HANDLE filehandle; /* Windows file handle */
+ HANDLE filehandle_secondary; /* Windows file handle
+ for file size changes */
+ bool direct_io; /* O_DIRECT configured */
};
#else
struct __wt_file_handle_posix {
- WT_FILE_HANDLE iface;
+ WT_FILE_HANDLE iface;
- /*
- * POSIX specific file handle fields
- */
- int fd; /* POSIX file handle */
+ /*
+ * POSIX specific file handle fields
+ */
+ int fd; /* POSIX file handle */
- bool direct_io; /* O_DIRECT configured */
+ bool direct_io; /* O_DIRECT configured */
};
#endif
struct __wt_file_handle_inmem {
- WT_FILE_HANDLE iface;
+ WT_FILE_HANDLE iface;
- /*
- * In memory specific file handle fields
- */
- uint64_t name_hash; /* hash of name */
- TAILQ_ENTRY(__wt_file_handle_inmem) q; /* internal queue, hash queue */
- TAILQ_ENTRY(__wt_file_handle_inmem) hashq;
+ /*
+ * In memory specific file handle fields
+ */
+ uint64_t name_hash; /* hash of name */
+ TAILQ_ENTRY(__wt_file_handle_inmem) q; /* internal queue, hash queue */
+ TAILQ_ENTRY(__wt_file_handle_inmem) hashq;
- WT_ITEM buf; /* Data */
- u_int ref; /* Reference count */
+ WT_ITEM buf; /* Data */
+ u_int ref; /* Reference count */
};
struct __wt_fstream {
- const char *name; /* Stream name */
+ const char *name; /* Stream name */
- FILE *fp; /* stdio FILE stream */
- WT_FH *fh; /* WT file handle */
- wt_off_t off; /* Read/write offset */
- wt_off_t size; /* File size */
- WT_ITEM buf; /* Data */
+ FILE *fp; /* stdio FILE stream */
+ WT_FH *fh; /* WT file handle */
+ wt_off_t off; /* Read/write offset */
+ wt_off_t size; /* File size */
+ WT_ITEM buf; /* Data */
/* AUTOMATIC FLAG VALUE GENERATION START */
-#define WT_STREAM_APPEND 0x1u /* Open a stream for append */
-#define WT_STREAM_READ 0x2u /* Open a stream for read */
-#define WT_STREAM_WRITE 0x4u /* Open a stream for write */
-/* AUTOMATIC FLAG VALUE GENERATION STOP */
- uint32_t flags;
-
- int (*close)(WT_SESSION_IMPL *, WT_FSTREAM *);
- int (*fstr_flush)(WT_SESSION_IMPL *, WT_FSTREAM *);
- int (*fstr_getline)(WT_SESSION_IMPL *, WT_FSTREAM *, WT_ITEM *);
- int (*fstr_printf)(
- WT_SESSION_IMPL *, WT_FSTREAM *, const char *, va_list);
+#define WT_STREAM_APPEND 0x1u /* Open a stream for append */
+#define WT_STREAM_READ 0x2u /* Open a stream for read */
+#define WT_STREAM_WRITE 0x4u /* Open a stream for write */
+ /* AUTOMATIC FLAG VALUE GENERATION STOP */
+ uint32_t flags;
+
+ int (*close)(WT_SESSION_IMPL *, WT_FSTREAM *);
+ int (*fstr_flush)(WT_SESSION_IMPL *, WT_FSTREAM *);
+ int (*fstr_getline)(WT_SESSION_IMPL *, WT_FSTREAM *, WT_ITEM *);
+ int (*fstr_printf)(WT_SESSION_IMPL *, WT_FSTREAM *, const char *, va_list);
};