diff options
Diffstat (limited to 'src/third_party/wiredtiger/src/include/schema.h')
-rw-r--r-- | src/third_party/wiredtiger/src/include/schema.h | 28 |
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) |