From 19fc30311689b42f12f1c88f9d87b73dcc9b6bdd Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 30 Jan 2010 18:22:56 +0000 Subject: [PATCH] Add additional pagerMutexHeld() macros to better verify the correct operation of pager.c. FossilOrigin-Name: c50e972f1bea2e357f64ffd5df868bf51d942e2d --- manifest | 22 +++++++++------------- manifest.uuid | 2 +- src/pager.c | 20 +++++++++++++++----- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index a5dbb16448..b8bae38937 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----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 @@ -124,7 +124,7 @@ F src/os_common.h e8b748b2f2ecc8a498e50bfe5d8721f189c19d2a 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 @@ -637,18 +637,14 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130 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----- diff --git a/manifest.uuid b/manifest.uuid index d56c3d99d5..a997f06ca7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea3b941a7182851117fab9851e98e175ebb356e2 \ No newline at end of file +c50e972f1bea2e357f64ffd5df868bf51d942e2d \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index f89101e3a6..cd6128b781 100644 --- a/src/pager.c +++ b/src/pager.c @@ -401,8 +401,8 @@ struct Pager { #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 */ @@ -527,10 +527,10 @@ static const unsigned char aJournalMagic[] = { #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--; @@ -706,6 +706,7 @@ static void pager_resize_hash_table(Pager *pPager, int N){ 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 ){ @@ -1424,6 +1425,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){ } sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; + pagerMutexHeld(pPager); for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ pPg->inJournal = 0; pPg->dirty = 0; @@ -2941,6 +2943,7 @@ static int syncJournal(Pager *pPager){ ** invariant is true. */ else{ + pagerMutexHeld(pPager); for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ assert( pPg->needSync==0 ); } @@ -3179,7 +3182,7 @@ static int pager_recycle(Pager *pPager, PgHdr **ppPg){ /* 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); @@ -3629,8 +3632,11 @@ static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){ 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->nPagemxPage || pPager->lru.pFirst==0 || MEMDB @@ -3664,11 +3670,13 @@ static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){ 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; @@ -4715,6 +4723,7 @@ int sqlite3PagerCommitPhaseOne( #endif rc = writeMasterJournal(pPager, zMaster); if( rc!=SQLITE_OK ) goto sync_exit; + pagerMutexHeld(pPager); rc = syncJournal(pPager); } if( rc!=SQLITE_OK ) goto sync_exit; @@ -4842,6 +4851,7 @@ int sqlite3PagerRollback(Pager *pPager){ 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 ); -- 2.47.2