]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Mark the shared-memory in the WAL implementation as volatile.
authordrh <drh@noemail.net>
Tue, 18 May 2010 13:27:12 +0000 (13:27 +0000)
committerdrh <drh@noemail.net>
Tue, 18 May 2010 13:27:12 +0000 (13:27 +0000)
FossilOrigin-Name: 0a6787908e989bd5e6af25acbdc59ebc8fa61d6d

manifest
manifest.uuid
src/os.c
src/os.h
src/os_unix.c
src/sqlite.h.in
src/test6.c
src/test_devsym.c
src/test_osinst.c
src/test_vfs.c
src/wal.c

index 6d9beedcb0d8bb8e11fade309fff7b4b4fa66f12..6990ed085928a452abd9997ba412eaebcfe6a4c0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C Comment\sclarifications\sin\swal.c.
-D 2010-05-18T12:56:50
+C Mark\sthe\sshared-memory\sin\sthe\sWAL\simplementation\sas\svolatile.
+D 2010-05-18T13:27:13
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -151,11 +151,11 @@ F src/mutex_os2.c 20477db50cf3817c2f1cd3eb61e5c177e50231db
 F src/mutex_unix.c becb8c4e07616abf84650d3687d62a1461d5d9cd
 F src/mutex_w32.c fb1cf87c5a88b56c7df0d9ddb796ed9641046c3d
 F src/notify.c cbfa66a836da3a51567209636e6a94059c137930
-F src/os.c c0a5dfce2a214dacb679425632d04f8a2021f364
-F src/os.h 8a7e2456237ecf3a2e55b02f9fe6091f1ad36902
+F src/os.c b994b2f4c9a2c406a20d43b59c22ed39a1e704d1
+F src/os.h 207c26793c9b518aa670480a3a262250dd3c98b1
 F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f
 F src/os_os2.c 665876d5eec7585226b0a1cf5e18098de2b2da19
-F src/os_unix.c 28caddcd74e6f0ded69476de5cf3f3b670ed840a
+F src/os_unix.c 6db3289dcfe8f2ec0277ad025e072254252a00c9
 F src/os_win.c 70c4a3327716213b59adf3a8adf2d5318b044a19
 F src/pager.c 1e163a82ae8405433dca559831caa06aafbba3b0
 F src/pager.h 76466c3a5af56943537f68b1f16567101a0cd1d0
@@ -171,7 +171,7 @@ F src/resolve.c ac5f1a713cd1ae77f08b83cc69581e11bf5ae6f9
 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
 F src/select.c c03d8a0565febcde8c6a12c5d77d065fddae889b
 F src/shell.c fd4ccdb37c3b68de0623eb938a649e0990710714
-F src/sqlite.h.in 14aa9773a255f1dca579218f0981806a3c1b479c
+F src/sqlite.h.in aa9086ea3a365843d62ce120cba458ecad6edd63
 F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
 F src/sqliteInt.h c1ca9bed7c963343f90edaf0ec31b8ff4b43fb01
 F src/sqliteLimit.h 196e2f83c3b444c4548fc1874f52f84fdbda40f3
@@ -183,7 +183,7 @@ F src/test2.c 31f1b9d076b4774a22d2605d0af1f34e14a9a7bd
 F src/test3.c 4c21700c73a890a47fc685c1097bfb661346ac94
 F src/test4.c ad03bb987ddedce928f4258c1e7fa4109a73497d
 F src/test5.c cc55900118fa4add8ec9cf69fc4225a4662f76b1
-F src/test6.c d00c3930e2d22a9dc84415b1a2ead2ca4ab430ae
+F src/test6.c 21f6ec70b5142c37846364e7da0580f7a05b0fc0
 F src/test7.c 3f2d63e4ccf97f8c2cf1a7fa0a3c8e2e2a354e6e
 F src/test8.c f959db9a22d882013b64c92753fa793b2ce3bdea
 F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60
@@ -193,7 +193,7 @@ F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de
 F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2
 F src/test_config.c 6210f501d358bde619ae761f06f123529c6ba24f
 F src/test_demovfs.c da81a5f7785bb352bda7911c332a983ec4f17f27
-F src/test_devsym.c 136869028132c3dc34fe920a9fda716f391227f4
+F src/test_devsym.c 2c5221c047183e081da523bae16ae5d792c4caaf
 F src/test_func.c 13b582345fb1185a93e46c53310fae8547dcce20
 F src/test_hexio.c 1237f000ec7a491009b1233f5c626ea71bce1ea2
 F src/test_init.c 5d624ffd0409d424cf9adbfe1f056b200270077c
@@ -204,13 +204,13 @@ F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e
 F src/test_malloc.c 2842c922b8e8d992aba722214952204ca025b411
 F src/test_mutex.c ce06b59aca168cd8c520b77159a24352a7469bd3
 F src/test_onefile.c df4d7858b5cd1dffe92d36ec9dbad11f0037ffd1
-F src/test_osinst.c f7f8e69ea2e3ae35d12504d4a217d4428877d10c
+F src/test_osinst.c 33207e761effffc31a867f9d4a8bb1f52fe6ee92
 F src/test_pcache.c 7bf828972ac0d2403f5cfa4cd14da41f8ebe73d8
 F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0
 F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6
 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
 F src/test_thread.c aa9919c885a1fe53eafc73492f0898ee6c0a0726
-F src/test_vfs.c 3601f9b6d46cb6daf0697d60c76bf8e18b90b123
+F src/test_vfs.c 7fc397aa5a52e2bf64fa0b46f3b9f40767150289
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/tokenize.c 25ceb0f0a746ea1d0f9553787f3f0a56853cfaeb
 F src/trigger.c 8927588cb9e6d47f933b53bfe74200fbb504100d
@@ -227,7 +227,7 @@ F src/vdbeblob.c 5327132a42a91e8b7acfb60b9d2c3b1c5c863e0e
 F src/vdbemem.c 2a82f455f6ca6f78b59fb312f96054c04ae0ead1
 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
 F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda
-F src/wal.c 5bdd0270bd6eedf019df41ead35353d5b346cb66
+F src/wal.c 03c150ff23332a58dd0cf313c7b7defdd9ec6275
 F src/wal.h 434f76f51225bb614e43ccb6bd2341541ba6a06e
 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
 F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356
@@ -816,14 +816,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 7162c45673d1068d1fda55a70207a3cd77575502
-R a078a222bb7d32b26fd0000547f355b7
+P a029be10172e2e6a2ef4e3eb2ea1bd0ca85b16ed
+R c3edbc896fce7d9f6c83f7337ac02298
 U drh
-Z cf716cae7bdeb338c84b4a59498f0eb8
+Z 88ded0b14b6354cb7517528585f793ca
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFL8o6WoxKgR168RlERAjcxAJ0bDrt/4Xf5RaRzO3o43bqrLgiBdQCggLtQ
-OfJWkWn8VUJrOX/ADyfjINI=
-=kAai
+iD8DBQFL8pW0oxKgR168RlERAoCBAJ9VXFufUgFrlJ8vv69PNeEYGWy/IgCcD99s
+/C+oicnjvVyzr2OBGGMkk9c=
+=CSoB
 -----END PGP SIGNATURE-----
index c7ca18c947e73d7f88227c144f1d7872e53b0b91..e0d553b0af0b94b074d1986b764492265b153092 100644 (file)
@@ -1 +1 @@
-a029be10172e2e6a2ef4e3eb2ea1bd0ca85b16ed
\ No newline at end of file
+0a6787908e989bd5e6af25acbdc59ebc8fa61d6d
\ No newline at end of file
index 9ad13690ce877efdf5bf1e7f5dffe193482b208c..44848fdbb88e67c3cbbc636b242291c329ae8f00 100644 (file)
--- a/src/os.c
+++ b/src/os.c
@@ -104,7 +104,7 @@ int sqlite3OsShmOpen(sqlite3_file *id){
 int sqlite3OsShmSize(sqlite3_file *id, int reqSize, int *pNewSize){
   return id->pMethods->xShmSize(id, reqSize, pNewSize);
 }
-int sqlite3OsShmGet(sqlite3_file *id, int reqSize, int *pSize, void **pp){
+int sqlite3OsShmGet(sqlite3_file *id,int reqSize,int *pSize,void volatile **pp){
   return id->pMethods->xShmGet(id, reqSize, pSize, pp);
 }
 int sqlite3OsShmRelease(sqlite3_file *id){
index cf7f2b7d7a447cba04082784cbeae6499e9ae869..8a08acc72102918835b969f84cdf6fde5f2de782 100644 (file)
--- a/src/os.h
+++ b/src/os.h
@@ -245,7 +245,7 @@ int sqlite3OsSectorSize(sqlite3_file *id);
 int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
 int sqlite3OsShmOpen(sqlite3_file *id);
 int sqlite3OsShmSize(sqlite3_file *id, int, int*);
-int sqlite3OsShmGet(sqlite3_file *id, int, int*, void**);
+int sqlite3OsShmGet(sqlite3_file *id, int, int*, void volatile**);
 int sqlite3OsShmRelease(sqlite3_file *id);
 int sqlite3OsShmLock(sqlite3_file *id, int, int*);
 int sqlite3OsShmClose(sqlite3_file *id, int);
index 420623824bfd3bff9efa449f1cef1b00fb3adb53..928ee635546605f9a4fdf057a20cc81d3c3473d3 100644 (file)
@@ -3675,7 +3675,7 @@ static int unixShmGet(
   sqlite3_file *fd,        /* Database file holding shared memory */
   int reqMapSize,          /* Requested size of mapping. -1 means don't care */
   int *pNewMapSize,        /* Write new size of mapping here */
-  void **ppBuf             /* Write mapping buffer origin here */
+  void volatile **ppBuf    /* Write mapping buffer origin here */
 ){
   unixFile *pDbFd = (unixFile*)fd;
   unixShm *p = pDbFd->pShm;
index 66ab68b30d53108a647e27f9154c4d6d668cce43..8676aeaa7385e6a2888112c016d2f77be2beff4f 100644 (file)
@@ -656,7 +656,7 @@ struct sqlite3_io_methods {
   /* Methods above are valid for version 1 */
   int (*xShmOpen)(sqlite3_file*);
   int (*xShmSize)(sqlite3_file*, int reqSize, int *pNewSize);
-  int (*xShmGet)(sqlite3_file*, int reqSize, int *pSize, void**);
+  int (*xShmGet)(sqlite3_file*, int reqSize, int *pSize, void volatile**);
   int (*xShmRelease)(sqlite3_file*);
   int (*xShmLock)(sqlite3_file*, int desiredLock, int *gotLock);
   int (*xShmClose)(sqlite3_file*, int deleteFlag);
index 9b5c3f615e5adf9371770f943279f4ef54c78005..98db74aabbf1f2bf4353c9c4426aa080066582a5 100644 (file)
@@ -529,7 +529,12 @@ static int cfShmOpen(sqlite3_file *pFile){
 static int cfShmSize(sqlite3_file *pFile, int reqSize, int *pNew){
   return sqlite3OsShmSize(((CrashFile*)pFile)->pRealFile, reqSize, pNew);
 }
-static int cfShmGet(sqlite3_file *pFile, int reqSize, int *pSize, void **pp){
+static int cfShmGet(
+  sqlite3_file *pFile,
+  int reqSize,
+  int *pSize,
+  void volatile **pp
+){
   return sqlite3OsShmGet(((CrashFile*)pFile)->pRealFile, reqSize, pSize, pp);
 }
 static int cfShmRelease(sqlite3_file *pFile){
index 0a60b3c94d3107bf67d9adf79d4963510305c32e..3dab67abe9ca9913e089c51041886971ac8c0ac1 100644 (file)
@@ -52,7 +52,7 @@ static int devsymSectorSize(sqlite3_file*);
 static int devsymDeviceCharacteristics(sqlite3_file*);
 static int devsymShmOpen(sqlite3_file*);
 static int devsymShmSize(sqlite3_file*,int,int*);
-static int devsymShmGet(sqlite3_file*,int,int*,void**);
+static int devsymShmGet(sqlite3_file*,int,int*,volatile void**);
 static int devsymShmRelease(sqlite3_file*);
 static int devsymShmLock(sqlite3_file*,int,int*);
 static int devsymShmClose(sqlite3_file*,int);
@@ -248,7 +248,12 @@ static int devsymShmSize(sqlite3_file *pFile, int reqSize, int *pSize){
   devsym_file *p = (devsym_file *)pFile;
   return sqlite3OsShmSize(p->pReal, reqSize, pSize);
 }
-static int devsymShmGet(sqlite3_file *pFile, int reqSz, int *pSize, void **pp){
+static int devsymShmGet(
+  sqlite3_file *pFile,
+  int reqSz,
+  int *pSize,
+  void volatile **pp
+){
   devsym_file *p = (devsym_file *)pFile;
   return sqlite3OsShmGet(p->pReal, reqSz, pSize, pp);
 }
index c75e0cf8cb6332b22c10fcb907a088156f47af60..0c8d311e38901b458aad9f67ad84a5720a855abe 100644 (file)
@@ -147,7 +147,7 @@ static int vfslogDeviceCharacteristics(sqlite3_file*);
 
 static int vfslogShmOpen(sqlite3_file *pFile);
 static int vfslogShmSize(sqlite3_file *pFile, int reqSize, int *pNewSize);
-static int vfslogShmGet(sqlite3_file *pFile, int req, int *pSize, void **pp);
+static int vfslogShmGet(sqlite3_file *pFile, int,int*,volatile void **);
 static int vfslogShmRelease(sqlite3_file *pFile);
 static int vfslogShmLock(sqlite3_file *pFile, int desiredLock, int *gotLock);
 static int vfslogShmClose(sqlite3_file *pFile, int deleteFlag);
@@ -420,7 +420,12 @@ static int vfslogShmSize(sqlite3_file *pFile, int reqSize, int *pNewSize){
   vfslog_call(p->pVfslog, OS_SHMSIZE, p->iFileId, t, rc, 0, 0);
   return rc;
 }
-static int vfslogShmGet(sqlite3_file *pFile, int req, int *pSize, void **pp){
+static int vfslogShmGet(
+  sqlite3_file *pFile,
+  int req,
+  int *pSize,
+  volatile void **pp
+){
   int rc;
   sqlite3_uint64 t;
   VfslogFile *p = (VfslogFile *)pFile;
@@ -1193,4 +1198,3 @@ int SqlitetestOsinst_Init(Tcl_Interp *interp){
 }
 
 #endif /* SQLITE_TEST */
-
index ce4afa762226480acea72cefd12c8cc1e3ccb5cc..f4dec595110ef7f1aeedbc6149f89bab1aa9f81b 100644 (file)
@@ -100,7 +100,7 @@ static int tvfsCurrentTime(sqlite3_vfs*, double*);
 
 static int tvfsShmOpen(sqlite3_file*);
 static int tvfsShmSize(sqlite3_file*, int , int *);
-static int tvfsShmGet(sqlite3_file*, int , int *, void **);
+static int tvfsShmGet(sqlite3_file*, int , int *, volatile void **);
 static int tvfsShmRelease(sqlite3_file*);
 static int tvfsShmLock(sqlite3_file*, int , int *);
 static int tvfsShmClose(sqlite3_file*, int);
@@ -509,7 +509,7 @@ static int tvfsShmGet(
   sqlite3_file *pFile, 
   int reqMapSize, 
   int *pMapSize, 
-  void **pp
+  volatile void **pp
 ){
   int rc = SQLITE_OK;
   TestvfsFile *pFd = (TestvfsFile *)pFile;
index bf82c2848f45c34150388059e10dc04ef15f8437..f925bae4cccf76af2c501eb2e8bde70ea98c1b79 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -123,7 +123,7 @@ struct Wal {
   sqlite3_file *pWalFd;      /* File handle for WAL file */
   u32 iCallback;             /* Value to pass to log callback (or 0) */
   int szWIndex;              /* Size of the wal-index that is mapped in mem */
-  u32 *pWiData;              /* Pointer to wal-index content in memory */
+  volatile u32 *pWiData;     /* Pointer to wal-index content in memory */
   u8 lockState;              /* SQLITE_SHM_xxxx constant showing lock state */
   u8 readerType;             /* SQLITE_SHM_READ or SQLITE_SHM_READ_FULL */
   u8 exclusiveMode;          /* Non-zero if connection is in exclusive mode */
@@ -232,14 +232,14 @@ static int walSetLock(Wal *pWal, int desiredStatus){
 ** Update the header of the wal-index file.
 */
 static void walIndexWriteHdr(Wal *pWal, WalIndexHdr *pHdr){
-  u32 *aHdr = pWal->pWiData;                   /* Write header here */
-  u32 *aCksum = &aHdr[WALINDEX_HDR_NFIELD];    /* Write header cksum here */
+  volatile u32 *aHdr = pWal->pWiData;                 /* Write header here */
+  volatile u32 *aCksum = &aHdr[WALINDEX_HDR_NFIELD];  /* Write cksum here */
 
   assert( WALINDEX_HDR_NFIELD==sizeof(WalIndexHdr)/4 );
   assert( aHdr!=0 );
-  memcpy(aHdr, pHdr, sizeof(WalIndexHdr));
+  memcpy((void*)aHdr, pHdr, sizeof(WalIndexHdr));
   aCksum[0] = aCksum[1] = 1;
-  walChecksumBytes((u8 *)aHdr, sizeof(WalIndexHdr), aCksum);
+  walChecksumBytes((u8*)aHdr, sizeof(WalIndexHdr), (u32*)aCksum);
 }
 
 /*
@@ -415,7 +415,7 @@ static int walIndexMap(Wal *pWal, int reqSize){
   if( pWal->pWiData==0 || reqSize>pWal->szWIndex ){
     walIndexUnmap(pWal);
     rc = sqlite3OsShmGet(pWal->pDbFd, reqSize, &pWal->szWIndex,
-                             (void**)(char*)&pWal->pWiData);
+                             (void volatile**)(char volatile*)&pWal->pWiData);
     if( rc==SQLITE_OK && pWal->pWiData==0 ){
       /* Make sure pWal->pWiData is not NULL while we are holding the
       ** lock on the mapping. */
@@ -474,13 +474,13 @@ static int walHashKey(u32 iPage){
 static void walHashFind(
   Wal *pWal,                      /* WAL handle */
   u32 iFrame,                     /* Find the hash table indexing this frame */
-  HASHTABLE_DATATYPE **paHash,    /* OUT: Pointer to hash index */
-  u32 **paPgno,                   /* OUT: Pointer to page number array */
+  volatile HASHTABLE_DATATYPE **paHash,    /* OUT: Pointer to hash index */
+  volatile u32 **paPgno,          /* OUT: Pointer to page number array */
   u32 *piZero                     /* OUT: Frame associated with *paPgno[0] */
 ){
   u32 iZero;
-  u32 *aPgno;
-  HASHTABLE_DATATYPE *aHash;
+  volatile u32 *aPgno;
+  volatile HASHTABLE_DATATYPE *aHash;
 
   iZero = ((iFrame-1)/HASHTABLE_NPAGE) * HASHTABLE_NPAGE;
   aPgno = &pWal->pWiData[walIndexEntry(iZero+1)-iZero-1];
@@ -529,13 +529,13 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
   if( rc==SQLITE_OK ){
     int iKey;                     /* Hash table key */
     u32 iZero;                    /* One less than frame number of aPgno[1] */
-    u32 *aPgno;                   /* Page number array */
-    HASHTABLE_DATATYPE *aHash;    /* Hash table */
-    int idx;                      /* Value to write to hash-table slot */
+    volatile u32 *aPgno;                 /* Page number array */
+    volatile HASHTABLE_DATATYPE *aHash;  /* Hash table */
+    int idx;                             /* Value to write to hash-table slot */
 
     walHashFind(pWal, iFrame, &aHash, &aPgno, &iZero);
     idx = iFrame - iZero;
-    if( idx==1 ) memset(aHash, 0, HASHTABLE_NBYTE);
+    if( idx==1 ) memset((void*)aHash, 0, HASHTABLE_NBYTE);
     aPgno[iFrame] = iPage;
     for(iKey=walHashKey(iPage); aHash[iKey]; iKey=(iKey+1)%HASHTABLE_NSLOT);
     aHash[iKey] = idx;
@@ -760,7 +760,7 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){
   if( rc!=SQLITE_OK ){
     return rc;
   }
-  aData = pWal->pWiData;
+  aData = (u32*)pWal->pWiData;
   iLast = pWal->hdr.iLastPg;
   nSegment = (iLast >> 8) + 1;
   nFinal = (iLast & 0x000000FF);
@@ -951,7 +951,7 @@ int walIndexTryHdr(Wal *pWal, int *pChanged){
   ** file, meaning it is possible that an inconsistent snapshot is read
   ** from the file. If this happens, return non-zero.
   */
-  memcpy(aHdr, pWal->pWiData, sizeof(aHdr));
+  memcpy(aHdr, (void*)pWal->pWiData, sizeof(aHdr));
   walChecksumBytes((u8*)aHdr, sizeof(u32)*WALINDEX_HDR_NFIELD, aCksum);
   if( aCksum[0]!=aHdr[WALINDEX_HDR_NFIELD]
    || aCksum[1]!=aHdr[WALINDEX_HDR_NFIELD+1]
@@ -1148,8 +1148,8 @@ int sqlite3WalRead(
   ** can occur. But if it does, it should not cause any problems.
   */
   for(iHash=iLast; iHash>0 && iRead==0; iHash-=HASHTABLE_NPAGE){
-    HASHTABLE_DATATYPE *aHash;    /* Pointer to hash table */
-    u32 *aPgno;                   /* Pointer to array of page numbers */
+    volatile HASHTABLE_DATATYPE *aHash;  /* Pointer to hash table */
+    volatile u32 *aPgno;                 /* Pointer to array of page numbers */
     u32 iZero;                    /* Frame number corresponding to aPgno[0] */
     int iKey;                     /* Hash slot index */
 
@@ -1222,7 +1222,7 @@ int sqlite3WalWriteLock(Wal *pWal, int op){
     if( rc==SQLITE_OK ){
       rc = walIndexMap(pWal, sizeof(WalIndexHdr));
       if( rc==SQLITE_OK
-       && memcmp(&pWal->hdr, pWal->pWiData, sizeof(WalIndexHdr))
+       && memcmp(&pWal->hdr, (void*)pWal->pWiData, sizeof(WalIndexHdr))
       ){
         rc = SQLITE_BUSY;
       }