aboutsummaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2013-03-25 20:30:13 +0000
committerdan <dan@noemail.net>2013-03-25 20:30:13 +0000
commitb7e3a326fe84ff10e9b34a9c11c32e441ac0fc5b (patch)
treec34aa4b4f1af4100a598a5167cd3ae927ead7cf9 /src/os_unix.c
parentdee6554811c66cccece15e2c16e58e59c5ab7764 (diff)
downloadsqlite-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.c29
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;