]> git.saurik.com Git - apt.git/commitdiff
[apt-pkg] yet another bit of mmap and pkgcachegen housekeeping
authorDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 23 Jul 2009 12:05:41 +0000 (14:05 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 23 Jul 2009 12:05:41 +0000 (14:05 +0200)
* add mmap error message also to the dynamic mmap
* remove some more {Ver,Desc} == 0 checks in for loops
* try to respect the given flags to the dynamic mmap
* open cached caches not as ReadOnly and not as Shared, so we
  always have a copy of the cache in the memory we can modify
  (e.g. set the hold state on-the-fly)

apt-pkg/contrib/mmap.cc
apt-pkg/pkgcachegen.cc

index ba4482131d4c1fd7b5ddc4388d3b16c9b93ed0a1..aa52b4c3066ef923ee5c622a98f77a21c0714622 100644 (file)
@@ -137,7 +137,6 @@ bool MMap::Sync(unsigned long Start,unsigned long Stop)
 }
                                                                        /*}}}*/
 
-                                                                       /*}}}*/
 // DynamicMMap::DynamicMMap - Constructor                              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -173,15 +172,24 @@ DynamicMMap::DynamicMMap(unsigned long Flags,unsigned long WorkSpace) :
       return;
 
 #ifdef _POSIX_MAPPED_FILES
+   // Set the permissions.
+   int Prot = PROT_READ;
+   int Map = MAP_PRIVATE | MAP_ANONYMOUS;
+   if ((Flags & ReadOnly) != ReadOnly)
+      Prot |= PROT_WRITE;
+   if ((Flags & Public) == Public)
+      Map = MAP_SHARED | MAP_ANONYMOUS;
+
    // use anonymous mmap() to get the memory
-   Base = (unsigned char*) mmap(0, WorkSpace, PROT_READ|PROT_WRITE,
-                       MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-   if(Base != MAP_FAILED)
-      return;
-#endif
+   Base = (unsigned char*) mmap(0, WorkSpace, Prot, Map, -1, 0);
+
+   if(Base == MAP_FAILED)
+      _error->Errno("DynamicMMap",_("Couldn't make mmap of %lu bytes"),WorkSpace);
+#else
    // fallback to a static allocated space
    Base = new unsigned char[WorkSpace];
    memset(Base,0,WorkSpace);
+#endif
    iSize = 0;
 }
                                                                        /*}}}*/
index ffc8d781691494f4ee4d529c0144b3fb05985c08..68180c7027ae5253716f69efdbe352ec4e1675a2 100644 (file)
@@ -372,7 +372,7 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
    
    // Link it to the end of the list
    map_ptrloc *Last = &Ver->FileList;
-   for (pkgCache::VerFileIterator V = Ver.FileList(); V != 0 && V.end() == false; V++)
+   for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; V++)
       Last = &V->NextFile;
    VF->NextFile = *Last;
    *Last = VF.Index();
@@ -428,7 +428,7 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
 
    // Link it to the end of the list
    map_ptrloc *Last = &Desc->FileList;
-   for (pkgCache::DescFileIterator D = Desc.FileList(); D != 0 && D.end() == false; D++)
+   for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++)
       Last = &D->NextFile;
 
    DF->NextFile = *Last;
@@ -518,7 +518,7 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
    if (OldDepVer != Ver)
    {
       OldDepLast = &Ver->DependsList;
-      for (pkgCache::DepIterator D = Ver.DependsList(); D != 0 && D.end() == false; D++)
+      for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
         OldDepLast = &D->NextDepends;
       OldDepVer = Ver;
    }
@@ -670,7 +670,7 @@ static bool CheckValidity(const string &CacheFile, FileIterator Start,
    
    // Map it
    FileFd CacheF(CacheFile,FileFd::ReadOnly);
-   SPtr<MMap> Map = new MMap(CacheF,MMap::Public | MMap::ReadOnly);
+   SPtr<MMap> Map = new MMap(CacheF,0);
    pkgCache Cache(Map);
    if (_error->PendingError() == true || Map->Size() == 0)
    {
@@ -854,7 +854,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
    else
    {
       // Just build it in memory..
-      Map = new DynamicMMap(MMap::Public,MapSize);
+      Map = new DynamicMMap(0,MapSize);
    }
    
    // Lets try the source cache.
@@ -866,8 +866,9 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
       // Preload the map with the source cache
       FileFd SCacheF(SrcCacheFile,FileFd::ReadOnly);
       unsigned long alloc = Map->RawAllocate(SCacheF.Size());
-      if (alloc == 0 || SCacheF.Read((unsigned char *)Map->Data() + alloc,
-                                    SCacheF.Size()) == false)
+      if ((alloc == 0 && _error->PendingError())
+               || SCacheF.Read((unsigned char *)Map->Data() + alloc,
+                               SCacheF.Size()) == false)
         return false;
 
       TotalSize = ComputeSize(Files.begin()+EndOfSource,Files.end());
@@ -928,7 +929,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
       if (CacheF != 0)
       {
         delete Map.UnGuard();
-        *OutMap = new MMap(*CacheF,MMap::Public | MMap::ReadOnly);
+        *OutMap = new MMap(*CacheF,0);
       }
       else
       {
@@ -950,8 +951,7 @@ bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap)
    if (_system->AddStatusFiles(Files) == false)
       return false;
    
-   SPtr<DynamicMMap> Map;   
-   Map = new DynamicMMap(MMap::Public,MapSize);
+   SPtr<DynamicMMap> Map = new DynamicMMap(0,MapSize);
    unsigned long CurrentSize = 0;
    unsigned long TotalSize = 0;