-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
-C Fix\sa\smissing\smutex\son\spage\scache\struncation\sduring\svacuum\sand\sauto-vacuum\s\nwhen\sSQLITE_ENABLE_MEMORY_MANAGEMENT\sis\sengaged.
-D 2010-01-29T21:23:35
+C Add\sadditional\spagerMutexHeld()\smacros\sto\sbetter\sverify\sthe\scorrect\soperation\nof\spager.c.
+D 2010-01-30T18:22:56
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in 79aeba12300a54903f1b1257c1e7c190234045dd
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
F src/os_os2.c 0c3a5802bc4fdb7cb5f66771552b081c4e48a216
F src/os_unix.c a810e2aefdaddacf479407f76f8f4ca381d231b2
F src/os_win.c 3a60bddd07ea6f8adb2314dd5996ac97b988f403
-F src/pager.c 38743db63f91064ed68dba0b415cccf603be036a
+F src/pager.c 3b4bce33b051a1d22ae8d0df87f22d3700d6aedb
F src/pager.h 4f051fd856de6fd3c19aef5f82eace54122b9173
F src/parse.y fc4bd35c6088901f7c8daead26c6fb11c87d22e7
F src/pragma.c 2e4bb2e76e48a32750529fdc4bfe86ac5f54e01b
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P b6129f4cc28f6ba55d19039545555b33857ffd72
-R 298ea4553820c86bc49de9db5217cdcf
-T *bgcolor * #8696fe
-T *branch * branch-3.5.9
-T *sym-branch-3.5.9 *
-T -sym-trunk *
+P ea3b941a7182851117fab9851e98e175ebb356e2
+R bd7d6bb5cd32313270d6b71a45d11bfc
U drh
-Z bc97c693bc947a5ae3e3ed014689d2e7
+Z 9bc3ebc48726190adbe0cae17390612c
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
-iD8DBQFLY1HaoxKgR168RlERAoniAJwOUHTFrCPOA7r6/18Q/Dp5vxUEAwCdGNnZ
-0OTkC0QU7xRU5btnXdQ92nY=
-=Y3Su
+iD8DBQFLZHkGoxKgR168RlERAquJAJ0WynkMN7mPphhmB68hDJGBoRv+iACcCrqq
+j6ssvTULN5/drdc8tggA75U=
+=rCLK
-----END PGP SIGNATURE-----
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
Pager *pNext; /* Doubly linked list of pagers on which */
Pager *pPrev; /* sqlite3_release_memory() will work */
- int iInUseMM; /* Non-zero if unavailable to MM */
- int iInUseDB; /* Non-zero if in sqlite3_release_memory() */
+ volatile int iInUseMM; /* Non-zero if unavailable to MM */
+ volatile int iInUseDB; /* Non-zero if in sqlite3_release_memory() */
u8 onPagerList; /* True if part of the sqlite3PagerList */
#endif
char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */
#endif
p->iInUseDB = 0;
sqlite3_mutex_enter(mutex);
+ assert( p->iInUseMM==0 );
p->iInUseDB = 1;
sqlite3_mutex_leave(mutex);
}
- assert( p->iInUseMM==0 );
}
static void pagerLeave(Pager *p){
p->iInUseDB--;
sqlite3_free(pPager->aHash);
pPager->nHash = N;
pPager->aHash = aHash;
+ pagerMutexHeld(pPager);
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
int h;
if( pPg->pgno==0 ){
}
sqlite3BitvecDestroy(pPager->pInJournal);
pPager->pInJournal = 0;
+ pagerMutexHeld(pPager);
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
pPg->inJournal = 0;
pPg->dirty = 0;
** invariant is true.
*/
else{
+ pagerMutexHeld(pPager);
for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){
assert( pPg->needSync==0 );
}
/* It is illegal to call this function unless the pager object
** pointed to by pPager has at least one free page (page with nRef==0).
- */
+ */
assert(!MEMDB);
assert(pPager->lru.pFirst);
PgHdr *pPg;
int nByteHdr;
+
/* Create a new PgHdr if any of the four conditions defined
- ** above are met: */
+ ** above are met:
+ */
+ pagerMutexHeld(pPager);
if( pPager->nPage<pPager->mxPage
|| pPager->lru.pFirst==0
|| MEMDB
memset(pPg, 0, nByteHdr);
pPg->pData = pData;
pPg->pPager = pPager;
+ pagerMutexHeld(pPager);
pPg->pNextAll = pPager->pAll;
pPager->pAll = pPg;
pPager->nPage++;
}else{
/* Recycle an existing page with a zero ref-count. */
+ pagerMutexHeld(pPager);
rc = pager_recycle(pPager, &pPg);
if( rc==SQLITE_BUSY ){
rc = SQLITE_IOERR_BLOCKED;
#endif
rc = writeMasterJournal(pPager, zMaster);
if( rc!=SQLITE_OK ) goto sync_exit;
+ pagerMutexHeld(pPager);
rc = syncJournal(pPager);
}
if( rc!=SQLITE_OK ) goto sync_exit;
PAGERTRACE2("ROLLBACK %d\n", PAGERID(pPager));
if( MEMDB ){
PgHdr *p;
+ pagerMutexHeld(pPager);
for(p=pPager->pAll; p; p=p->pNextAll){
PgHistory *pHist;
assert( !p->alwaysRollback );