diff options
author | dan <dan@noemail.net> | 2013-03-25 20:30:13 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2013-03-25 20:30:13 +0000 |
commit | b7e3a326fe84ff10e9b34a9c11c32e441ac0fc5b (patch) | |
tree | c34aa4b4f1af4100a598a5167cd3ae927ead7cf9 /src/os_unix.c | |
parent | dee6554811c66cccece15e2c16e58e59c5ab7764 (diff) | |
download | sqlite-b7e3a326fe84ff10e9b34a9c11c32e441ac0fc5b.tar.gz sqlite-b7e3a326fe84ff10e9b34a9c11c32e441ac0fc5b.zip |
Use mremap() on Linux.
FossilOrigin-Name: 431aecc8600c29c203546e48d256510510238887
Diffstat (limited to 'src/os_unix.c')
-rw-r--r-- | src/os_unix.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index 9d2e2c130..33be79342 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4544,21 +4544,28 @@ static int unixMapfile(unixFile *pFd, i64 nByte){ } if( nMap!=pFd->mmapSize ){ - unixUnmapfile(pFd); + void *pNew = 0; - if( nMap>0 ){ - void *pNew; - int flags = PROT_READ; - if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; - pNew = osMmap(0, nMap, flags, MAP_SHARED, pFd->h, 0); - if( pNew==MAP_FAILED ){ - return SQLITE_IOERR_MMAP; +#if defined(__linux__) && defined(_GNU_SOURCE) + if( pFd->pMapRegion && nMap>0 ){ + pNew = mremap(pFd->pMapRegion, pFd->mmapOrigsize, nMap, MREMAP_MAYMOVE); + }else +#endif + { + unixUnmapfile(pFd); + if( nMap>0 ){ + int flags = PROT_READ; + if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; + pNew = osMmap(0, nMap, flags, MAP_SHARED, pFd->h, 0); } + } - pFd->pMapRegion = pNew; - pFd->mmapSize = nMap; - pFd->mmapOrigsize = nMap; + if( pNew==MAP_FAILED ){ + return SQLITE_IOERR_MMAP; } + pFd->pMapRegion = pNew; + pFd->mmapSize = nMap; + pFd->mmapOrigsize = nMap; } return SQLITE_OK; |