Mark the shared-memory in the WAL implementation as volatile.

FossilOrigin-Name: 0a6787908e989bd5e6af25acbdc59ebc8fa61d6d
This commit is contained in:
drh 2010-05-18 13:27:12 +00:00
parent e730fec883
commit 5939f44375
11 changed files with 63 additions and 49 deletions

View File

@ -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-----

View File

@ -1 +1 @@
a029be10172e2e6a2ef4e3eb2ea1bd0ca85b16ed
0a6787908e989bd5e6af25acbdc59ebc8fa61d6d

View File

@ -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){

View File

@ -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);

View 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;

View 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);

View 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){

View 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);
}

View 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 */

View 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;

View File

@ -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;
}