diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/os_unix.c | 9 | ||||
-rw-r--r-- | src/wal.c | 10 |
2 files changed, 9 insertions, 10 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index 34f98f55a..72cc06a02 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5339,12 +5339,7 @@ static int unixShmLock( case SQLITE_SHM_CHECKPOINT: { assert( p->lockState==SQLITE_SHM_UNLOCK || p->lockState==SQLITE_SHM_PENDING - || p->lockState==SQLITE_SHM_RECOVER ); - if( p->lockState==SQLITE_SHM_RECOVER ){ - unixShmUnlock(pFile, p, UNIX_SHM_C); - p->lockState = SQLITE_SHM_CHECKPOINT; - rc = SQLITE_OK; - } + ); if( p->lockState==SQLITE_SHM_UNLOCK ){ rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_B|UNIX_SHM_C); if( rc==SQLITE_OK ){ @@ -5363,7 +5358,7 @@ static int unixShmLock( assert( desiredLock==SQLITE_SHM_RECOVER ); assert( p->lockState==SQLITE_SHM_READ || p->lockState==SQLITE_SHM_READ_FULL - || p->lockState==SQLITE_SHM_CHECKPOINT ); + ); assert( sqlite3_mutex_held(pFile->mutexBuf) ); rc = unixShmExclusiveLock(pFile, p, UNIX_SHM_C); if( rc==SQLITE_OK ){ @@ -501,7 +501,7 @@ static int walIndexRecover(Wal *pWal){ i64 nSize; /* Size of log file */ WalIndexHdr hdr; /* Recovered wal-index header */ - assert( pWal->lockState==SQLITE_SHM_RECOVER ); + assert( pWal->lockState>SQLITE_SHM_READ ); memset(&hdr, 0, sizeof(hdr)); rc = sqlite3OsFileSize(pWal->pFd, &nSize); @@ -941,7 +941,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ ** time as well, run log recovery. */ lockState = pWal->lockState; - if( SQLITE_OK==(rc = walSetLock(pWal, SQLITE_SHM_RECOVER)) ){ + if( lockState>SQLITE_SHM_READ + || SQLITE_OK==(rc = walSetLock(pWal, SQLITE_SHM_RECOVER)) + ){ /* This call to walIndexTryHdr() may not return an error code, as the ** wal-index is already mapped. It may find that the header is invalid, ** but there is no chance of hitting an actual error. */ @@ -952,7 +954,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ *pChanged = 1; rc = walIndexRecover(pWal); } - walSetLock(pWal, lockState); + if( lockState==SQLITE_SHM_READ ){ + walSetLock(pWal, SQLITE_SHM_READ); + } } return rc; |