]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/mmap.cc
be able to disable resolver with APT::Get::CallResolver and disable
[apt.git] / apt-pkg / contrib / mmap.cc
index b3f29032c4a6397eeda2e47a47d78de2be12afa6..9945b160679d081469d3ee3c7ccdf4d51a127b4c 100644 (file)
@@ -106,7 +106,7 @@ bool MMap::Map(FileFd &Fd)
 /* */
 bool MMap::Close(bool DoSync)
 {
 /* */
 bool MMap::Close(bool DoSync)
 {
-   if ((Flags & UnMapped) == UnMapped || Base == 0 || iSize == 0)
+   if ((Flags & UnMapped) == UnMapped || validData() == false || iSize == 0)
       return true;
    
    if (DoSync == true)
       return true;
    
    if (DoSync == true)
@@ -225,22 +225,22 @@ DynamicMMap::DynamicMMap(unsigned long Flags,unsigned long const &WorkSpace,
 
        // disable Moveable if we don't grow
        if (Grow == 0)
 
        // disable Moveable if we don't grow
        if (Grow == 0)
-               Flags &= ~Moveable;
+               this->Flags &= ~Moveable;
 
 #ifndef __linux__
        // kfreebsd doesn't have mremap, so we use the fallback
 
 #ifndef __linux__
        // kfreebsd doesn't have mremap, so we use the fallback
-       if ((Flags & Moveable) == Moveable)
-               Flags |= Fallback;
+       if ((this->Flags & Moveable) == Moveable)
+               this->Flags |= Fallback;
 #endif
 
 #ifdef _POSIX_MAPPED_FILES
 #endif
 
 #ifdef _POSIX_MAPPED_FILES
-       if ((Flags & Fallback) != Fallback) {
+       if ((this->Flags & Fallback) != Fallback) {
                // Set the permissions.
                int Prot = PROT_READ;
                int Map = MAP_PRIVATE | MAP_ANONYMOUS;
                // Set the permissions.
                int Prot = PROT_READ;
                int Map = MAP_PRIVATE | MAP_ANONYMOUS;
-               if ((Flags & ReadOnly) != ReadOnly)
+               if ((this->Flags & ReadOnly) != ReadOnly)
                        Prot |= PROT_WRITE;
                        Prot |= PROT_WRITE;
-               if ((Flags & Public) == Public)
+               if ((this->Flags & Public) == Public)
                        Map = MAP_SHARED | MAP_ANONYMOUS;
 
                // use anonymous mmap() to get the memory
                        Map = MAP_SHARED | MAP_ANONYMOUS;
 
                // use anonymous mmap() to get the memory
@@ -266,6 +266,8 @@ DynamicMMap::~DynamicMMap()
 {
    if (Fd == 0)
    {
 {
    if (Fd == 0)
    {
+      if (validData() == false)
+        return;
 #ifdef _POSIX_MAPPED_FILES
       munmap(Base, WorkSpace);
 #else
 #ifdef _POSIX_MAPPED_FILES
       munmap(Base, WorkSpace);
 #else
@@ -297,7 +299,7 @@ unsigned long DynamicMMap::RawAllocate(unsigned long Size,unsigned long Aln)
    {
       if(!Grow())
       {
    {
       if(!Grow())
       {
-        _error->Error(_("Dynamic MMap ran out of room. Please increase the size "
+        _error->Fatal(_("Dynamic MMap ran out of room. Please increase the size "
                         "of APT::Cache-Limit. Current value: %lu. (man 5 apt.conf)"), WorkSpace);
         return 0;
       }
                         "of APT::Cache-Limit. Current value: %lu. (man 5 apt.conf)"), WorkSpace);
         return 0;
       }
@@ -314,7 +316,7 @@ unsigned long DynamicMMap::Allocate(unsigned long ItemSize)
    // Look for a matching pool entry
    Pool *I;
    Pool *Empty = 0;
    // Look for a matching pool entry
    Pool *I;
    Pool *Empty = 0;
-   for (I = Pools; I != Pools + PoolCount; I++)
+   for (I = Pools; I != Pools + PoolCount; ++I)
    {
       if (I->ItemSize == 0)
         Empty = I;
    {
       if (I->ItemSize == 0)
         Empty = I;
@@ -342,7 +344,11 @@ unsigned long DynamicMMap::Allocate(unsigned long ItemSize)
    {
       const unsigned long size = 20*1024;
       I->Count = size/ItemSize;
    {
       const unsigned long size = 20*1024;
       I->Count = size/ItemSize;
+      Pool* oldPools = Pools;
       Result = RawAllocate(size,ItemSize);
       Result = RawAllocate(size,ItemSize);
+      if (Pools != oldPools)
+        I += Pools - oldPools;
+
       // Does the allocation failed ?
       if (Result == 0 && _error->PendingError())
         return 0;
       // Does the allocation failed ?
       if (Result == 0 && _error->PendingError())
         return 0;
@@ -365,7 +371,7 @@ unsigned long DynamicMMap::WriteString(const char *String,
    if (Len == (unsigned long)-1)
       Len = strlen(String);
 
    if (Len == (unsigned long)-1)
       Len = strlen(String);
 
-   unsigned long Result = RawAllocate(Len+1,0);
+   unsigned long const Result = RawAllocate(Len+1,0);
 
    if (Result == 0 && _error->PendingError())
       return 0;
 
    if (Result == 0 && _error->PendingError())
       return 0;
@@ -392,19 +398,25 @@ unsigned long DynamicMMap::WriteString(const char *String,
    the nearly impossible 4 to grow it before it finally give up: Never say never. */
 bool DynamicMMap::Grow() {
        if (Limit != 0 && WorkSpace >= Limit)
    the nearly impossible 4 to grow it before it finally give up: Never say never. */
 bool DynamicMMap::Grow() {
        if (Limit != 0 && WorkSpace >= Limit)
-               return _error->Error(_("The size of a MMap has already reached the defined limit of %lu bytes,"
-                                      "abort the try to grow the MMap."), Limit);
+               return _error->Error(_("Unable to increase the size of the MMap as the "
+                                      "limit of %lu bytes is already reached."), Limit);
+       if (GrowFactor <= 0)
+               return _error->Error(_("Unable to increase size of the MMap as automatic growing is disabled by user."));
 
 
-       unsigned long const newSize = WorkSpace + 1024*1024;
+       unsigned long const newSize = WorkSpace + GrowFactor;
 
        if(Fd != 0) {
                Fd->Seek(newSize - 1);
                char C = 0;
                Fd->Write(&C,sizeof(C));
        }
 
        if(Fd != 0) {
                Fd->Seek(newSize - 1);
                char C = 0;
                Fd->Write(&C,sizeof(C));
        }
+
+       unsigned long const poolOffset = Pools - ((Pool*) Base);
+
        if ((Flags & Fallback) != Fallback) {
 #if defined(_POSIX_MAPPED_FILES) && defined(__linux__)
    #ifdef MREMAP_MAYMOVE
        if ((Flags & Fallback) != Fallback) {
 #if defined(_POSIX_MAPPED_FILES) && defined(__linux__)
    #ifdef MREMAP_MAYMOVE
+
                if ((Flags & Moveable) == Moveable)
                        Base = mremap(Base, WorkSpace, newSize, MREMAP_MAYMOVE);
                else
                if ((Flags & Moveable) == Moveable)
                        Base = mremap(Base, WorkSpace, newSize, MREMAP_MAYMOVE);
                else
@@ -425,6 +437,7 @@ bool DynamicMMap::Grow() {
                        return false;
        }
 
                        return false;
        }
 
+       Pools =(Pool*) Base + poolOffset;
        WorkSpace = newSize;
        return true;
 }
        WorkSpace = newSize;
        return true;
 }