Index: third_party/sqlite/src/src/btmutex.c |
diff --git a/third_party/sqlite/src/src/btmutex.c b/third_party/sqlite/src/src/btmutex.c |
index c9c8572dfb2544616f576f33bbf0b15631f54fce..ddffb67fa4ecf774d5da8400fa3763c5bdabff64 100644 |
--- a/third_party/sqlite/src/src/btmutex.c |
+++ b/third_party/sqlite/src/src/btmutex.c |
@@ -169,21 +169,6 @@ int sqlite3BtreeHoldsMutex(Btree *p){ |
#endif |
-#ifndef SQLITE_OMIT_INCRBLOB |
-/* |
-** Enter and leave a mutex on a Btree given a cursor owned by that |
-** Btree. These entry points are used by incremental I/O and can be |
-** omitted if that module is not used. |
-*/ |
-void sqlite3BtreeEnterCursor(BtCursor *pCur){ |
- sqlite3BtreeEnter(pCur->pBtree); |
-} |
-void sqlite3BtreeLeaveCursor(BtCursor *pCur){ |
- sqlite3BtreeLeave(pCur->pBtree); |
-} |
-#endif /* SQLITE_OMIT_INCRBLOB */ |
- |
- |
/* |
** Enter the mutex on every Btree associated with a database |
** connection. This is needed (for example) prior to parsing |
@@ -198,16 +183,24 @@ void sqlite3BtreeLeaveCursor(BtCursor *pCur){ |
** two or more btrees in common both try to lock all their btrees |
** at the same instant. |
*/ |
-void sqlite3BtreeEnterAll(sqlite3 *db){ |
+static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){ |
int i; |
+ int skipOk = 1; |
Btree *p; |
assert( sqlite3_mutex_held(db->mutex) ); |
for(i=0; i<db->nDb; i++){ |
p = db->aDb[i].pBt; |
- if( p ) sqlite3BtreeEnter(p); |
+ if( p && p->sharable ){ |
+ sqlite3BtreeEnter(p); |
+ skipOk = 0; |
+ } |
} |
+ db->skipBtreeMutex = skipOk; |
} |
-void sqlite3BtreeLeaveAll(sqlite3 *db){ |
+void sqlite3BtreeEnterAll(sqlite3 *db){ |
+ if( db->skipBtreeMutex==0 ) btreeEnterAll(db); |
+} |
+static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){ |
int i; |
Btree *p; |
assert( sqlite3_mutex_held(db->mutex) ); |
@@ -216,13 +209,8 @@ void sqlite3BtreeLeaveAll(sqlite3 *db){ |
if( p ) sqlite3BtreeLeave(p); |
} |
} |
- |
-/* |
-** Return true if a particular Btree requires a lock. Return FALSE if |
-** no lock is ever required since it is not sharable. |
-*/ |
-int sqlite3BtreeSharable(Btree *p){ |
- return p->sharable; |
+void sqlite3BtreeLeaveAll(sqlite3 *db){ |
+ if( db->skipBtreeMutex==0 ) btreeLeaveAll(db); |
} |
#ifndef NDEBUG |
@@ -298,4 +286,23 @@ void sqlite3BtreeEnterAll(sqlite3 *db){ |
} |
} |
#endif /* if SQLITE_THREADSAFE */ |
+ |
+#ifndef SQLITE_OMIT_INCRBLOB |
+/* |
+** Enter a mutex on a Btree given a cursor owned by that Btree. |
+** |
+** These entry points are used by incremental I/O only. Enter() is required |
+** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not |
+** the build is threadsafe. Leave() is only required by threadsafe builds. |
+*/ |
+void sqlite3BtreeEnterCursor(BtCursor *pCur){ |
+ sqlite3BtreeEnter(pCur->pBtree); |
+} |
+# if SQLITE_THREADSAFE |
+void sqlite3BtreeLeaveCursor(BtCursor *pCur){ |
+ sqlite3BtreeLeave(pCur->pBtree); |
+} |
+# endif |
+#endif /* ifndef SQLITE_OMIT_INCRBLOB */ |
+ |
#endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ |