summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/include/schema.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/include/schema.h')
-rw-r--r--src/third_party/wiredtiger/src/include/schema.h28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/third_party/wiredtiger/src/include/schema.h b/src/third_party/wiredtiger/src/include/schema.h
index 023fd398f1c..88a3a39f8b3 100644
--- a/src/third_party/wiredtiger/src/include/schema.h
+++ b/src/third_party/wiredtiger/src/include/schema.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2015 MongoDB, Inc.
+ * Copyright (c) 2014-2016 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
@@ -82,9 +82,17 @@ struct __wt_table {
* WT_WITH_LOCK --
* Acquire a lock, perform an operation, drop the lock.
*/
-#define WT_WITH_LOCK(session, lock, flag, op) do { \
+#define WT_WITH_LOCK(session, ret, lock, flag, op) do { \
+ ret = 0; \
if (F_ISSET(session, (flag))) { \
op; \
+ } else if (F_ISSET(session, WT_SESSION_LOCK_NO_WAIT)) { \
+ if ((ret = __wt_spin_trylock(session, (lock))) == 0) { \
+ F_SET(session, (flag)); \
+ op; \
+ F_CLR(session, (flag)); \
+ __wt_spin_unlock(session, (lock)); \
+ } \
} else { \
__wt_spin_lock(session, (lock)); \
F_SET(session, (flag)); \
@@ -98,16 +106,16 @@ struct __wt_table {
* WT_WITH_CHECKPOINT_LOCK --
* Acquire the checkpoint lock, perform an operation, drop the lock.
*/
-#define WT_WITH_CHECKPOINT_LOCK(session, op) \
- WT_WITH_LOCK(session, \
+#define WT_WITH_CHECKPOINT_LOCK(session, ret, op) \
+ WT_WITH_LOCK(session, ret, \
&S2C(session)->checkpoint_lock, WT_SESSION_LOCKED_CHECKPOINT, op)
/*
* WT_WITH_HANDLE_LIST_LOCK --
* Acquire the data handle list lock, perform an operation, drop the lock.
*/
-#define WT_WITH_HANDLE_LIST_LOCK(session, op) \
- WT_WITH_LOCK(session, \
+#define WT_WITH_HANDLE_LIST_LOCK(session, ret, op) \
+ WT_WITH_LOCK(session, ret, \
&S2C(session)->dhandle_lock, WT_SESSION_LOCKED_HANDLE_LIST, op)
/*
* WT_WITH_SCHEMA_LOCK --
@@ -115,12 +123,12 @@ struct __wt_table {
* Check that we are not already holding some other lock: the schema lock
* must be taken first.
*/
-#define WT_WITH_SCHEMA_LOCK(session, op) do { \
+#define WT_WITH_SCHEMA_LOCK(session, ret, op) do { \
WT_ASSERT(session, \
F_ISSET(session, WT_SESSION_LOCKED_SCHEMA) || \
!F_ISSET(session, WT_SESSION_LOCKED_HANDLE_LIST | \
WT_SESSION_NO_SCHEMA_LOCK | WT_SESSION_LOCKED_TABLE)); \
- WT_WITH_LOCK(session, \
+ WT_WITH_LOCK(session, ret, \
&S2C(session)->schema_lock, WT_SESSION_LOCKED_SCHEMA, op); \
} while (0)
@@ -128,11 +136,11 @@ struct __wt_table {
* WT_WITH_TABLE_LOCK --
* Acquire the table lock, perform an operation, drop the lock.
*/
-#define WT_WITH_TABLE_LOCK(session, op) do { \
+#define WT_WITH_TABLE_LOCK(session, ret, op) do { \
WT_ASSERT(session, \
F_ISSET(session, WT_SESSION_LOCKED_TABLE) || \
!F_ISSET(session, WT_SESSION_LOCKED_HANDLE_LIST)); \
- WT_WITH_LOCK(session, \
+ WT_WITH_LOCK(session, ret, \
&S2C(session)->table_lock, WT_SESSION_LOCKED_TABLE, op); \
} while (0)