1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Create and use a new pager interface sqlite3PagerUnrefNotNull() that works

just like sqlite3PagerUnref() but guarantees that its argument is not a
NULL pointer.

FossilOrigin-Name: e00f37e2333cac5b53e17cf764ab56c4fcd5f617
This commit is contained in:
drh
2013-12-13 19:35:21 +00:00
parent 5d56dd2867
commit da8a330a03
5 changed files with 31 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
C Enhance\sthe\spcache1PinPage()\sroutine\sso\sthat\sit\scalled\smuch\sless\soften\sand\nruns\smuch\sfaster\sin\sthe\scases\swhen\sit\sis\sactually\scalled. C Create\sand\suse\sa\snew\spager\sinterface\ssqlite3PagerUnrefNotNull()\sthat\sworks\njust\slike\ssqlite3PagerUnref()\sbut\sguarantees\sthat\sits\sargument\sis\snot\sa\nNULL\spointer.
D 2013-12-13T18:50:40.859 D 2013-12-13T19:35:21.600
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53 F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
F src/btree.c 09285d6ffe7d819b9656ea9b7ecf1ab949a926fb F src/btree.c 11e29ef8cf16a42925fde036bcffbeffd9cc82df
F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9
F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda
@@ -207,8 +207,8 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f
F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07
F src/pager.c 95a568497d789d5729927fca93fec653c485df45 F src/pager.c 4757194b2f1ffd65a5fc45a3df4d38acc41fb7b3
F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/parse.y acee1a9958539e21263362b194594c5255ad2fca
F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
@@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 P a845779cd31aec3204a6a9c776bd9c9f7d47dd24
R 47d549dcdf3ed528411247342cb19e3a R 0519b15291565e2dff816e0cb01e063b
U drh U drh
Z da9f1c1b1e757ffeeb8c40974d788c01 Z 0b683c4f7d4e0f307681d123364409c6

View File

@@ -1 +1 @@
a845779cd31aec3204a6a9c776bd9c9f7d47dd24 e00f37e2333cac5b53e17cf764ab56c4fcd5f617

View File

@@ -1673,10 +1673,11 @@ static void releasePage(MemPage *pPage){
if( pPage ){ if( pPage ){
assert( pPage->aData ); assert( pPage->aData );
assert( pPage->pBt ); assert( pPage->pBt );
assert( pPage->pDbPage!=0 );
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData );
assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) );
sqlite3PagerUnref(pPage->pDbPage); sqlite3PagerUnrefNotNull(pPage->pDbPage);
} }
} }

View File

@@ -1990,7 +1990,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){
PgHdr *p = pager_lookup(pPager, 1); PgHdr *p = pager_lookup(pPager, 1);
if( p ){ if( p ){
p->pageHash = 0; p->pageHash = 0;
sqlite3PagerUnref(p); sqlite3PagerUnrefNotNull(p);
} }
} }
#endif #endif
@@ -2983,7 +2983,7 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
pPager->xReiniter(pPg); pPager->xReiniter(pPg);
} }
sqlite3PagerUnref(pPg); sqlite3PagerUnrefNotNull(pPg);
} }
} }
@@ -5439,16 +5439,19 @@ DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
** are released, a rollback occurs and the lock on the database is ** are released, a rollback occurs and the lock on the database is
** removed. ** removed.
*/ */
void sqlite3PagerUnref(DbPage *pPg){ void sqlite3PagerUnrefNotNull(DbPage *pPg){
if( pPg ){ Pager *pPager;
Pager *pPager = pPg->pPager; assert( pPg!=0 );
if( pPg->flags & PGHDR_MMAP ){ pPager = pPg->pPager;
pagerReleaseMapPage(pPg); if( pPg->flags & PGHDR_MMAP ){
}else{ pagerReleaseMapPage(pPg);
sqlite3PcacheRelease(pPg); }else{
} sqlite3PcacheRelease(pPg);
pagerUnlockIfUnused(pPager);
} }
pagerUnlockIfUnused(pPager);
}
void sqlite3PagerUnref(DbPage *pPg){
if( pPg ) sqlite3PagerUnrefNotNull(pPg);
} }
/* /*
@@ -5830,14 +5833,14 @@ int sqlite3PagerWrite(DbPage *pDbPage){
if( pPage->flags&PGHDR_NEED_SYNC ){ if( pPage->flags&PGHDR_NEED_SYNC ){
needSync = 1; needSync = 1;
} }
sqlite3PagerUnref(pPage); sqlite3PagerUnrefNotNull(pPage);
} }
} }
}else if( (pPage = pager_lookup(pPager, pg))!=0 ){ }else if( (pPage = pager_lookup(pPager, pg))!=0 ){
if( pPage->flags&PGHDR_NEED_SYNC ){ if( pPage->flags&PGHDR_NEED_SYNC ){
needSync = 1; needSync = 1;
} }
sqlite3PagerUnref(pPage); sqlite3PagerUnrefNotNull(pPage);
} }
} }
@@ -5853,7 +5856,7 @@ int sqlite3PagerWrite(DbPage *pDbPage){
PgHdr *pPage = pager_lookup(pPager, pg1+ii); PgHdr *pPage = pager_lookup(pPager, pg1+ii);
if( pPage ){ if( pPage ){
pPage->flags |= PGHDR_NEED_SYNC; pPage->flags |= PGHDR_NEED_SYNC;
sqlite3PagerUnref(pPage); sqlite3PagerUnrefNotNull(pPage);
} }
} }
} }
@@ -6783,7 +6786,7 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){
if( MEMDB ){ if( MEMDB ){
assert( pPgOld ); assert( pPgOld );
sqlite3PcacheMove(pPgOld, origPgno); sqlite3PcacheMove(pPgOld, origPgno);
sqlite3PagerUnref(pPgOld); sqlite3PagerUnrefNotNull(pPgOld);
} }
if( needSyncPgno ){ if( needSyncPgno ){
@@ -6812,7 +6815,7 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){
} }
pPgHdr->flags |= PGHDR_NEED_SYNC; pPgHdr->flags |= PGHDR_NEED_SYNC;
sqlite3PcacheMakeDirty(pPgHdr); sqlite3PcacheMakeDirty(pPgHdr);
sqlite3PagerUnref(pPgHdr); sqlite3PagerUnrefNotNull(pPgHdr);
} }
return SQLITE_OK; return SQLITE_OK;

View File

@@ -136,6 +136,7 @@ int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno);
void sqlite3PagerRef(DbPage*); void sqlite3PagerRef(DbPage*);
void sqlite3PagerUnref(DbPage*); void sqlite3PagerUnref(DbPage*);
void sqlite3PagerUnrefNotNull(DbPage*);
/* Operations on page references. */ /* Operations on page references. */
int sqlite3PagerWrite(DbPage*); int sqlite3PagerWrite(DbPage*);