mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
Simplifications to the locking logic in the unix-dotfile VFS.
FossilOrigin-Name: 583813525888c7e106f3e8cb46c1a507006daee6
This commit is contained in:
@@ -1350,6 +1350,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
|
||||
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
|
||||
|
||||
assert( pFile );
|
||||
assert( pFile->eFileLock<=SHARED_LOCK );
|
||||
unixEnterMutex(); /* Because pFile->pInode is shared across threads */
|
||||
|
||||
/* Check if a thread in this process holds such a lock */
|
||||
@@ -1760,9 +1761,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
|
||||
if( unixFileLock(pFile, &lock)==(-1) ){
|
||||
tErrno = errno;
|
||||
rc = SQLITE_IOERR_UNLOCK;
|
||||
if( IS_LOCK_ERROR(rc) ){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
}
|
||||
storeLastErrno(pFile, tErrno);
|
||||
goto end_unlock;
|
||||
}
|
||||
lock.l_type = F_RDLCK;
|
||||
@@ -1784,9 +1783,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
|
||||
if( unixFileLock(pFile, &lock)==(-1) ){
|
||||
tErrno = errno;
|
||||
rc = SQLITE_IOERR_UNLOCK;
|
||||
if( IS_LOCK_ERROR(rc) ){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
}
|
||||
storeLastErrno(pFile, tErrno);
|
||||
goto end_unlock;
|
||||
}
|
||||
}else
|
||||
@@ -2037,17 +2034,7 @@ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) {
|
||||
SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
|
||||
|
||||
assert( pFile );
|
||||
|
||||
/* Check if a thread in this process holds such a lock */
|
||||
if( pFile->eFileLock>SHARED_LOCK ){
|
||||
/* Either this connection or some other connection in the same process
|
||||
** holds a lock on the file. No need to check further. */
|
||||
reserved = 1;
|
||||
}else{
|
||||
/* The lock is held if and only if the lockfile exists */
|
||||
const char *zLockFile = (const char*)pFile->lockingContext;
|
||||
reserved = osAccess(zLockFile, 0)==0;
|
||||
}
|
||||
reserved = osAccess((const char*)pFile->lockingContext, 0)==0;
|
||||
OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved));
|
||||
*pResOut = reserved;
|
||||
return rc;
|
||||
@@ -2109,7 +2096,7 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) {
|
||||
rc = SQLITE_BUSY;
|
||||
} else {
|
||||
rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
|
||||
if( IS_LOCK_ERROR(rc) ){
|
||||
if( rc!=SQLITE_BUSY ){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
}
|
||||
}
|
||||
@@ -2156,14 +2143,12 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) {
|
||||
/* To fully unlock the database, delete the lock file */
|
||||
assert( eFileLock==NO_LOCK );
|
||||
rc = osRmdir(zLockFile);
|
||||
if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile);
|
||||
if( rc<0 ){
|
||||
int tErrno = errno;
|
||||
rc = 0;
|
||||
if( ENOENT != tErrno ){
|
||||
if( tErrno==ENOENT ){
|
||||
rc = SQLITE_OK;
|
||||
}else{
|
||||
rc = SQLITE_IOERR_UNLOCK;
|
||||
}
|
||||
if( IS_LOCK_ERROR(rc) ){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
}
|
||||
return rc;
|
||||
@@ -2176,14 +2161,11 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) {
|
||||
** Close a file. Make sure the lock has been released before closing.
|
||||
*/
|
||||
static int dotlockClose(sqlite3_file *id) {
|
||||
int rc = SQLITE_OK;
|
||||
if( id ){
|
||||
unixFile *pFile = (unixFile*)id;
|
||||
dotlockUnlock(id, NO_LOCK);
|
||||
sqlite3_free(pFile->lockingContext);
|
||||
rc = closeUnixFile(id);
|
||||
}
|
||||
return rc;
|
||||
unixFile *pFile = (unixFile*)id;
|
||||
assert( id!=0 );
|
||||
dotlockUnlock(id, NO_LOCK);
|
||||
sqlite3_free(pFile->lockingContext);
|
||||
return closeUnixFile(id);
|
||||
}
|
||||
/****************** End of the dot-file lock implementation *******************
|
||||
******************************************************************************/
|
||||
@@ -2249,10 +2231,8 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){
|
||||
int tErrno = errno;
|
||||
/* unlock failed with an error */
|
||||
lrc = SQLITE_IOERR_UNLOCK;
|
||||
if( IS_LOCK_ERROR(lrc) ){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
rc = lrc;
|
||||
}
|
||||
storeLastErrno(pFile, tErrno);
|
||||
rc = lrc;
|
||||
}
|
||||
} else {
|
||||
int tErrno = errno;
|
||||
@@ -2385,12 +2365,9 @@ static int flockUnlock(sqlite3_file *id, int eFileLock) {
|
||||
** Close a file.
|
||||
*/
|
||||
static int flockClose(sqlite3_file *id) {
|
||||
int rc = SQLITE_OK;
|
||||
if( id ){
|
||||
flockUnlock(id, NO_LOCK);
|
||||
rc = closeUnixFile(id);
|
||||
}
|
||||
return rc;
|
||||
assert( id!=0 );
|
||||
flockUnlock(id, NO_LOCK);
|
||||
return closeUnixFile(id);
|
||||
}
|
||||
|
||||
#endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */
|
||||
@@ -3015,23 +2992,22 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
|
||||
*/
|
||||
static int afpClose(sqlite3_file *id) {
|
||||
int rc = SQLITE_OK;
|
||||
if( id ){
|
||||
unixFile *pFile = (unixFile*)id;
|
||||
afpUnlock(id, NO_LOCK);
|
||||
unixEnterMutex();
|
||||
if( pFile->pInode && pFile->pInode->nLock ){
|
||||
/* If there are outstanding locks, do not actually close the file just
|
||||
** yet because that would clear those locks. Instead, add the file
|
||||
** descriptor to pInode->aPending. It will be automatically closed when
|
||||
** the last lock is cleared.
|
||||
*/
|
||||
setPendingFd(pFile);
|
||||
}
|
||||
releaseInodeInfo(pFile);
|
||||
sqlite3_free(pFile->lockingContext);
|
||||
rc = closeUnixFile(id);
|
||||
unixLeaveMutex();
|
||||
unixFile *pFile = (unixFile*)id;
|
||||
assert( id!=0 );
|
||||
afpUnlock(id, NO_LOCK);
|
||||
unixEnterMutex();
|
||||
if( pFile->pInode && pFile->pInode->nLock ){
|
||||
/* If there are outstanding locks, do not actually close the file just
|
||||
** yet because that would clear those locks. Instead, add the file
|
||||
** descriptor to pInode->aPending. It will be automatically closed when
|
||||
** the last lock is cleared.
|
||||
*/
|
||||
setPendingFd(pFile);
|
||||
}
|
||||
releaseInodeInfo(pFile);
|
||||
sqlite3_free(pFile->lockingContext);
|
||||
rc = closeUnixFile(id);
|
||||
unixLeaveMutex();
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -7374,7 +7350,7 @@ static int proxyUnlock(sqlite3_file *id, int eFileLock) {
|
||||
** Close a file that uses proxy locks.
|
||||
*/
|
||||
static int proxyClose(sqlite3_file *id) {
|
||||
if( id ){
|
||||
if( ALWAYS(id) ){
|
||||
unixFile *pFile = (unixFile*)id;
|
||||
proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
|
||||
unixFile *lockProxy = pCtx->lockProxy;
|
||||
|
||||
Reference in New Issue
Block a user