]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add additional pagerMutexHeld() macros to better verify the correct operation
authordrh <drh@noemail.net>
Sat, 30 Jan 2010 18:22:56 +0000 (18:22 +0000)
committerdrh <drh@noemail.net>
Sat, 30 Jan 2010 18:22:56 +0000 (18:22 +0000)
of pager.c.

FossilOrigin-Name: c50e972f1bea2e357f64ffd5df868bf51d942e2d

manifest
manifest.uuid
src/pager.c

index a5dbb16448da9861c581a73c025c505dcfba2df2..b8bae38937c73e73fa7e44ed91b2f92ec373f7d8 100644 (file)
--- 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-----
index d56c3d99d529df7429a912dca31b1bc9bff1307b..a997f06ca79bf8f62b540012e9f5587b2bc79745 100644 (file)
@@ -1 +1 @@
-ea3b941a7182851117fab9851e98e175ebb356e2
\ No newline at end of file
+c50e972f1bea2e357f64ffd5df868bf51d942e2d
\ No newline at end of file
index f89101e3a6a98860755e9aca955a11b1ce7e6da0..cd6128b7812516c2399b9f113a68d722c3d7d9ef 100644 (file)
@@ -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->nPage<pPager->mxPage
    || 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 );