mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Add the new sqlite3PagerUnrefPageOne() pager method to deal with the special
case of unreferencing page1. FossilOrigin-Name: b2e2100cf766da1cb499aec0ca0a9969d7af5d93312ab8cf895fbf4a6ffb9b2f
This commit is contained in:
25
src/btree.c
25
src/btree.c
@@ -439,7 +439,8 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){
|
||||
|
||||
#endif /* SQLITE_OMIT_SHARED_CACHE */
|
||||
|
||||
static void releasePage(MemPage *pPage);
|
||||
static void releasePage(MemPage *pPage); /* Forward reference */
|
||||
static void releasePageOne(MemPage *pPage); /* Forward reference */
|
||||
static void releasePageNotNull(MemPage *pPage); /* Forward reference */
|
||||
|
||||
/*
|
||||
@@ -2109,6 +2110,8 @@ getAndInitPage_error:
|
||||
/*
|
||||
** Release a MemPage. This should be called once for each prior
|
||||
** call to btreeGetPage.
|
||||
**
|
||||
** Page1 is a special case and must be released using releasePageOne().
|
||||
*/
|
||||
static void releasePageNotNull(MemPage *pPage){
|
||||
assert( pPage->aData );
|
||||
@@ -2122,6 +2125,16 @@ static void releasePageNotNull(MemPage *pPage){
|
||||
static void releasePage(MemPage *pPage){
|
||||
if( pPage ) releasePageNotNull(pPage);
|
||||
}
|
||||
static void releasePageOne(MemPage *pPage){
|
||||
assert( pPage!=0 );
|
||||
assert( pPage->aData );
|
||||
assert( pPage->pBt );
|
||||
assert( pPage->pDbPage!=0 );
|
||||
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
|
||||
assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData );
|
||||
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
|
||||
sqlite3PagerUnrefPageOne(pPage->pDbPage);
|
||||
}
|
||||
|
||||
/*
|
||||
** Get an unused page.
|
||||
@@ -3000,7 +3013,7 @@ static int lockBtree(BtShared *pBt){
|
||||
}else{
|
||||
setDefaultSyncFlag(pBt, SQLITE_DEFAULT_WAL_SYNCHRONOUS+1);
|
||||
if( isOpen==0 ){
|
||||
releasePage(pPage1);
|
||||
releasePageOne(pPage1);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
}
|
||||
@@ -3047,7 +3060,7 @@ static int lockBtree(BtShared *pBt){
|
||||
** zero and return SQLITE_OK. The caller will call this function
|
||||
** again with the correct page-size.
|
||||
*/
|
||||
releasePage(pPage1);
|
||||
releasePageOne(pPage1);
|
||||
pBt->usableSize = usableSize;
|
||||
pBt->pageSize = pageSize;
|
||||
freeTempSpace(pBt);
|
||||
@@ -3101,7 +3114,7 @@ static int lockBtree(BtShared *pBt){
|
||||
return SQLITE_OK;
|
||||
|
||||
page1_init_failed:
|
||||
releasePage(pPage1);
|
||||
releasePageOne(pPage1);
|
||||
pBt->pPage1 = 0;
|
||||
return rc;
|
||||
}
|
||||
@@ -3146,7 +3159,7 @@ static void unlockBtreeIfUnused(BtShared *pBt){
|
||||
assert( pPage1->aData );
|
||||
assert( sqlite3PagerRefcount(pBt->pPager)==1 );
|
||||
pBt->pPage1 = 0;
|
||||
releasePageNotNull(pPage1);
|
||||
releasePageOne(pPage1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4068,7 +4081,7 @@ int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){
|
||||
if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage);
|
||||
testcase( pBt->nPage!=nPage );
|
||||
pBt->nPage = nPage;
|
||||
releasePage(pPage1);
|
||||
releasePageOne(pPage1);
|
||||
}
|
||||
assert( countValidCursors(pBt, 1)==0 );
|
||||
pBt->inTransaction = TRANS_READ;
|
||||
|
Reference in New Issue
Block a user