From eb162ff79b93ea98380f4555e0fe3116993241fb Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 23 Jul 2009 14:05:41 +0200 Subject: [apt-pkg] yet another bit of mmap and pkgcachegen housekeeping * 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 | 20 ++++++++++++++------ apt-pkg/pkgcachegen.cc | 20 ++++++++++---------- 2 files changed, 24 insertions(+), 16 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/mmap.cc b/apt-pkg/contrib/mmap.cc index ba4482131..aa52b4c30 100644 --- a/apt-pkg/contrib/mmap.cc +++ b/apt-pkg/contrib/mmap.cc @@ -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; } /*}}}*/ diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index ffc8d7816..68180c702 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -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 Map = new MMap(CacheF,MMap::Public | MMap::ReadOnly); + SPtr 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 Map; - Map = new DynamicMMap(MMap::Public,MapSize); + SPtr Map = new DynamicMMap(0,MapSize); unsigned long CurrentSize = 0; unsigned long TotalSize = 0; -- cgit v1.2.3