]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Minor changes to unixMapfile() function. two-mappings
authordan <dan@noemail.net>
Mon, 1 Apr 2013 14:20:23 +0000 (14:20 +0000)
committerdan <dan@noemail.net>
Mon, 1 Apr 2013 14:20:23 +0000 (14:20 +0000)
FossilOrigin-Name: 80c63443c438ec21cc02880801d4fb4ca5f4e23f

manifest
manifest.uuid
src/os_unix.c

index 47745bee28389a43cc5e521367ae9babf8e85606..e313b11daf3363922c94466a29e766766311906e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Further\sfixes\sfor\stest\sscripts.
-D 2013-03-29T19:38:52.044
+C Minor\schanges\sto\sunixMapfile()\sfunction.
+D 2013-04-01T14:20:23.253
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in df3e48659d80e1b7765785d8d66c86b320f72cc7
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -160,7 +160,7 @@ F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30
 F src/os.c 809d0707cec693e1b9b376ab229271ad74c3d35d
 F src/os.h ae08bcc5f6ec6b339f4a2adf3931bb88cc14c3e4
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
-F src/os_unix.c 0bebbe673f2831ce29c8da5f58f74e6c40c231ab
+F src/os_unix.c 2c54787f5c60b850bd8a9ed6c029100cde2429dc
 F src/os_win.c e4f17ddf79f2a9373e33ed70565e765d65324589
 F src/pager.c 30009ae5800f80e21da1f118fabfc72b34d8c722
 F src/pager.h 5cb78b8e1adfd5451e600be7719f5a99d87ac3b1
@@ -1040,7 +1040,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P e8bcdf938eee2c307c24d60d0295e5529291373b
-R cc0ac784c7ba54170d377b8c12f52908
+P 23ffa4f9fbad2e39cbe4776c7fdb61f757b6fc78
+R 6cd4d6bb1af95ad5b626cb22e4b9f0a4
 U dan
-Z d70c61b9811bd758a9987aa7e37737bb
+Z 2b8cf21f2c6587ad7587cd5c8a9f710d
index d95677af609aa987ecaac52a5e29556aa6e2d9da..e09af819ceaa4c8347aa3aa37f5bcf1aa15920f5 100644 (file)
@@ -1 +1 @@
-23ffa4f9fbad2e39cbe4776c7fdb61f757b6fc78
\ No newline at end of file
+80c63443c438ec21cc02880801d4fb4ca5f4e23f
\ No newline at end of file
index 53d3fec8065d6313c4fe4a131e947515769e9d66..3b195391d559da584ca3ee8894150053ee42b64e 100644 (file)
@@ -4590,12 +4590,17 @@ static int unixGetPagesize(void){
 ** code otherwise.
 */
 static int unixMapfile(unixFile *pFd, i64 nByte){
-  i64 nMap = nByte;
+  i64 nMap;                       /* Number of bytes of file to map */
   int rc;
 
   assert( nMap>=0 || pFd->nFetchOut==0 );
   if( pFd->nFetchOut>0 ) return SQLITE_OK;
 
+  /* Set variable nMap to the number of bytes of the file to map. This is
+  ** the smaller of argument nByte and the limit configured by
+  ** SQLITE_FCNTL_MMAP_LIMIT. Or, if nByte is less than zero, the smaller
+  ** of the file size or the SQLITE_FCNTL_MMAP_LIMIT value.  */
+  nMap = nByte;
   if( nMap<0 ){
     struct stat statbuf;          /* Low-level file information */
     rc = osFstat(pFd->h, &statbuf);
@@ -4609,7 +4614,6 @@ static int unixMapfile(unixFile *pFd, i64 nByte){
   }
 
   if( nMap!=(pFd->aMmap[0].mmapSize + pFd->aMmap[1].mmapSize) ){
-    void *pNew = 0;
 
     /* If the request is for a mapping zero bytes in size, or there are 
     ** currently already two mapping regions, or there is already a mapping
@@ -4617,7 +4621,7 @@ static int unixMapfile(unixFile *pFd, i64 nByte){
     ** everything.  */
     if( nMap==0 
 #if !HAVE_MREMAP
-     || (pFd->aMmap[0].pMapRegion && pFd->aMmap[1].pMapRegion) 
+     || (pFd->aMmap[0].pMapRegion && pFd->aMmap[1].pMapRegion)
      || (pFd->aMmap[0].mmapSize % pFd->szSyspage)
 #endif
     ){
@@ -4626,61 +4630,53 @@ static int unixMapfile(unixFile *pFd, i64 nByte){
     assert( pFd->aMmap[1].pMapRegion==0 );
 
     if( nMap>0 ){
+      unixMapping *pMap = &pFd->aMmap[0];   /* First mapping object */
+      void *pNew = 0;
+      int iNew = 0;
       int flags = PROT_READ;
       if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE;
 
       /* If there are currently no mappings, create a new one */
-      if( pFd->aMmap[0].pMapRegion==0 ){
+      if( pMap->pMapRegion==0 ){
         pNew = osMmap(0, nMap, flags, MAP_SHARED, pFd->h, 0);
-        if( pNew==MAP_FAILED ){
-          return SQLITE_IOERR_MMAP;
-        }
-        pFd->aMmap[0].pMapRegion = pNew;
-        pFd->aMmap[0].mmapSize = nMap;
-        pFd->aMmap[0].mmapOrigsize = nMap;
       }
 #if HAVE_MREMAP
       /* If we have an mremap() call, resize the existing mapping. */
       else{
-        unixMapping *pMap = &pFd->aMmap[0];
         pNew = osMremap(
             pMap->pMapRegion, pMap->mmapOrigsize, nMap, MREMAP_MAYMOVE
         );
-        if( pNew==MAP_FAILED ){
-          return SQLITE_IOERR_MMAP;
-        }
-        pFd->aMmap[0].pMapRegion = pNew;
-        pFd->aMmap[0].mmapSize = nMap;
-        pFd->aMmap[0].mmapOrigsize = nMap;
       }
 #else
       /* Otherwise, create a second mapping. If the existing mapping is
       ** a multiple of the page-size in size, then request that the new
       ** mapping immediately follow the old in virtual memory.  */
       else{
-        unixMapping *pMap = &pFd->aMmap[0];
-        void *pAddr = 0;
-
-        nMap -= pMap->mmapSize;
+        i64 nNew;                 /* Bytes to map with this call */
+        void *pAddr = 0;          /* Virtual address to request mapping at */
 
+        nNew = nMap - pMap->mmapSize;
         if( pMap->mmapSize==pMap->mmapOrigsize ){
           pAddr = (void *)&((u8 *)pMap->pMapRegion)[pMap->mmapSize];
         }
 
-        pNew = osMmap(pAddr, nMap, flags, MAP_SHARED, pFd->h, pMap->mmapSize);
-        if( pNew==MAP_FAILED ){
-          return SQLITE_IOERR_MMAP;
-        }
-        if( pNew==pAddr ){
-          pMap->mmapOrigsize += nMap;
-          pMap->mmapSize += nMap;
+        pNew = osMmap(pAddr, nNew, flags, MAP_SHARED, pFd->h, pMap->mmapSize);
+
+        if( pAddr && pNew==pAddr ){
+          pNew = pMap->pMapRegion;
         }else{
-          pFd->aMmap[1].pMapRegion = pNew;
-          pFd->aMmap[1].mmapSize = nMap;
-          pFd->aMmap[1].mmapOrigsize = nMap;
+          iNew = 1;
+          nMap = nNew;
         }
       }
 #endif
+
+      if( pNew==MAP_FAILED ){
+        return SQLITE_IOERR_MMAP;
+      }
+      pFd->aMmap[iNew].pMapRegion = pNew;
+      pFd->aMmap[iNew].mmapSize = nMap;
+      pFd->aMmap[iNew].mmapOrigsize = nMap;
     }
   }