diff options
author | drh <drh@noemail.net> | 2017-01-02 18:19:29 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-01-02 18:19:29 +0000 |
commit | 38eef3217237f7066e08763100a9147247d135df (patch) | |
tree | 1e726fb8ad1ed80ed20c8daa73d59f95f540eaa4 /src | |
parent | 197231b16012a0adb93f32dba9238d9bcaef6cfe (diff) | |
download | sqlite-38eef3217237f7066e08763100a9147247d135df.tar.gz sqlite-38eef3217237f7066e08763100a9147247d135df.zip |
Avoid unnecessary calls to sqlite3BtreeEnterAll() and sqlite3BtreeLeaveAll()
when no btree is using shared-cache.
FossilOrigin-Name: cfb3158204628eb2fd170090a7f212df0e4ce6c9
Diffstat (limited to 'src')
-rw-r--r-- | src/attach.c | 1 | ||||
-rw-r--r-- | src/btmutex.c | 17 | ||||
-rw-r--r-- | src/sqliteInt.h | 1 |
3 files changed, 16 insertions, 3 deletions
diff --git a/src/attach.c b/src/attach.c index 4fe97bace..393c46ccb 100644 --- a/src/attach.c +++ b/src/attach.c @@ -137,6 +137,7 @@ static void attachFunc( rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags); sqlite3_free( zPath ); db->nDb++; + db->skipBtreeMutex = 0; if( rc==SQLITE_CONSTRAINT ){ rc = SQLITE_ERROR; zErrDyn = sqlite3MPrintf(db, "database is already attached"); diff --git a/src/btmutex.c b/src/btmutex.c index c1ebff960..ddffb67fa 100644 --- a/src/btmutex.c +++ b/src/btmutex.c @@ -183,16 +183,24 @@ int sqlite3BtreeHoldsMutex(Btree *p){ ** 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) ); @@ -201,6 +209,9 @@ void sqlite3BtreeLeaveAll(sqlite3 *db){ if( p ) sqlite3BtreeLeave(p); } } +void sqlite3BtreeLeaveAll(sqlite3 *db){ + if( db->skipBtreeMutex==0 ) btreeLeaveAll(db); +} #ifndef NDEBUG /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d78d2072d..6a01029b8 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1296,6 +1296,7 @@ struct sqlite3 { u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ u8 mTrace; /* zero or more SQLITE_TRACE flags */ + u8 skipBtreeMutex; /* True if no shared-cache backends */ int nextPagesize; /* Pagesize after VACUUM if >0 */ u32 magic; /* Magic number for detect library misuse */ int nChange; /* Value returned by sqlite3_changes() */ |