diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/btree.c | 1 | ||||
-rw-r--r-- | src/os_unix.c | 11 | ||||
-rw-r--r-- | src/pager.c | 14 | ||||
-rw-r--r-- | src/pager.h | 5 |
4 files changed, 24 insertions, 7 deletions
diff --git a/src/btree.c b/src/btree.c index 6bcf379d6..402503916 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3373,6 +3373,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ } }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); + sqlite3PagerResetLockTimeout(pBt->pPager); if( rc==SQLITE_OK ){ if( p->inTrans==TRANS_NONE ){ diff --git a/src/os_unix.c b/src/os_unix.c index ac4ec2f2f..2b9c117e3 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1490,18 +1490,15 @@ static int osSetPosixAdvisoryLock( unixFile *pFile /* Structure holding timeout value */ ){ int rc = osFcntl(h,F_SETLK,pLock); - if( rc<0 && pFile->iBusyTimeout>0 ){ + while( rc<0 && pFile->iBusyTimeout>0 ){ /* On systems that support some kind of blocking file lock with a timeout, ** make appropriate changes here to invoke that blocking file lock. On ** generic posix, however, there is no such API. So we simply try the ** lock once every millisecond until either the timeout expires, or until ** the lock is obtained. */ - do{ - usleep(1000); - rc = osFcntl(h,F_SETLK,pLock); - pFile->iBusyTimeout--; - }while( rc<0 && pFile->iBusyTimeout>0 ); - pFile->iBusyTimeout = 0; + usleep(1000); + rc = osFcntl(h,F_SETLK,pLock); + pFile->iBusyTimeout--; } return rc; } diff --git a/src/pager.c b/src/pager.c index 55f90057e..85d1845e9 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5693,6 +5693,7 @@ void sqlite3PagerUnrefPageOne(DbPage *pPg){ assert( pPg->pgno==1 ); assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ pPager = pPg->pPager; + sqlite3PagerResetLockTimeout(pPager); sqlite3PcacheRelease(pPg); pagerUnlockIfUnused(pPager); } @@ -6970,6 +6971,18 @@ sqlite3_file *sqlite3PagerFile(Pager *pPager){ return pPager->fd; } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Reset the lock timeout for pager. +*/ +void sqlite3PagerResetLockTimeout(Pager *pPager){ + if( isOpen(pPager->fd) ){ + int x = 0; + sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_LOCK_TIMEOUT, &x); + } +} +#endif + /* ** Return the file handle for the journal file (if it exists). ** This will be either the rollback journal or the WAL file. @@ -7430,6 +7443,7 @@ int sqlite3PagerCheckpoint( pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt ); + sqlite3PagerResetLockTimeout(pPager); } return rc; } diff --git a/src/pager.h b/src/pager.h index 48bc80df1..730e366fb 100644 --- a/src/pager.h +++ b/src/pager.h @@ -212,6 +212,11 @@ int sqlite3PagerIsMemdb(Pager*); void sqlite3PagerCacheStat(Pager *, int, int, int *); void sqlite3PagerClearCache(Pager*); int sqlite3SectorSize(sqlite3_file *); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +void sqlite3PagerResetLockTimeout(Pager *pPager); +#else +# define sqlite3PagerResetLockTimeout(X) +#endif /* Functions used to truncate the database file. */ void sqlite3PagerTruncateImage(Pager*,Pgno); |