[maemo-commits] [maemo-commits] r9917 - projects/haf/trunk/apt
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Feb 15 17:49:48 EET 2007
- Previous message: [maemo-commits] r9916 - projects/haf/trunk/apt/buildlib
- Next message: [maemo-commits] r9918 - projects/haf/trunk/apt/apt-pkg/contrib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: marivoll Date: 2007-02-15 17:49:47 +0200 (Thu, 15 Feb 2007) New Revision: 9917 Added: projects/haf/trunk/apt/mmap.patch Log: New. Added: projects/haf/trunk/apt/mmap.patch =================================================================== --- projects/haf/trunk/apt/mmap.patch 2007-02-15 15:44:34 UTC (rev 9916) +++ projects/haf/trunk/apt/mmap.patch 2007-02-15 15:49:47 UTC (rev 9917) @@ -0,0 +1,146 @@ +diff -rN -u old-apt/apt-pkg/contrib/mmap.cc new-apt/apt-pkg/contrib/mmap.cc +--- old-apt/apt-pkg/contrib/mmap.cc 2006-04-10 19:40:50.000000000 +0300 ++++ new-apt/apt-pkg/contrib/mmap.cc 2006-04-10 19:40:50.000000000 +0300 +@@ -35,13 +35,15 @@ + #include <sys/stat.h> + #include <unistd.h> + #include <fcntl.h> ++#include <errno.h> ++ + /*}}}*/ + + // MMap::MMap - Constructor /*{{{*/ + // --------------------------------------------------------------------- + /* */ + MMap::MMap(FileFd &F,unsigned long Flags) : Flags(Flags), iSize(0), +- Base(0) ++ Base(0), fd(0) + { + if ((Flags & NoImmMap) != NoImmMap) + Map(F); +@@ -51,7 +53,7 @@ + // --------------------------------------------------------------------- + /* */ + MMap::MMap(unsigned long Flags) : Flags(Flags), iSize(0), +- Base(0) ++ Base(0), fd(0) + { + } + /*}}}*/ +@@ -84,7 +86,26 @@ + // Map it. + Base = mmap(0,iSize,Prot,Map,Fd.Fd(),0); + if (Base == (void *)-1) +- return _error->Errno("mmap",_("Couldn't make mmap of %lu bytes"),iSize); ++ { ++ if (errno == ENODEV || errno == EINVAL) ++ { ++ // The filesystem doesn't support this particular kind of ++ // mmap. So we allocate a buffer and read the whole file ++ // into it. ++ // ++ int dupped_fd = dup (Fd.Fd()); ++ if (dupped_fd == -1) ++ return _error->Errno("mmap",_("Couldn't dup filedescriptor")); ++ ++ Base = new unsigned char[iSize]; ++ fd = new FileFd (dupped_fd); ++ if (!fd->Seek(0L) || !fd->Read(Base, iSize)) ++ return false; ++ } ++ else ++ return _error->Errno("mmap",_("Couldn't make mmap of %lu bytes"), ++ iSize); ++ } + + return true; + } +@@ -99,9 +120,18 @@ + + if (DoSync == true) + Sync(); +- +- if (munmap((char *)Base,iSize) != 0) +- _error->Warning("Unable to munmap"); ++ ++ if (fd) ++ { ++ delete[] (char *)Base; ++ delete fd; ++ fd = NULL; ++ } ++ else ++ { ++ if (munmap((char *)Base,iSize) != 0) ++ _error->Warning("Unable to munmap"); ++ } + + iSize = 0; + Base = 0; +@@ -113,14 +143,24 @@ + /* This is done in syncronous mode - the docs indicate that this will + not return till all IO is complete */ + bool MMap::Sync() +-{ ++{ + if ((Flags & UnMapped) == UnMapped) + return true; + + #ifdef _POSIX_SYNCHRONIZED_IO + if ((Flags & ReadOnly) != ReadOnly) +- if (msync((char *)Base,iSize,MS_SYNC) != 0) +- return _error->Errno("msync","Unable to write mmap"); ++ { ++ if (fd) ++ { ++ if (!fd->Seek (0) || !fd->Write (Base, iSize)) ++ return false; ++ } ++ else ++ { ++ if (msync((char *)Base,iSize,MS_SYNC) != 0) ++ return _error->Errno("msync","Unable to write mmap"); ++ } ++ } + #endif + return true; + } +@@ -136,8 +176,20 @@ + #ifdef _POSIX_SYNCHRONIZED_IO + unsigned long PSize = sysconf(_SC_PAGESIZE); + if ((Flags & ReadOnly) != ReadOnly) +- if (msync((char *)Base+(int)(Start/PSize)*PSize,Stop - Start,MS_SYNC) != 0) +- return _error->Errno("msync","Unable to write mmap"); ++ { ++ if (fd) ++ { ++ if (!fd->Seek (Start) ++ || !fd->Write (((char *)Base)+Start, Stop-Start)) ++ return false; ++ } ++ else ++ { ++ if (msync((char *)Base+(int)(Start/PSize)*PSize,Stop - Start, ++ MS_SYNC) != 0) ++ return _error->Errno("msync","Unable to write mmap"); ++ } ++ } + #endif + return true; + } +diff -rN -u old-apt/apt-pkg/contrib/mmap.h new-apt/apt-pkg/contrib/mmap.h +--- old-apt/apt-pkg/contrib/mmap.h 2006-04-10 19:40:50.000000000 +0300 ++++ new-apt/apt-pkg/contrib/mmap.h 2006-04-10 19:41:00.000000000 +0300 +@@ -47,6 +47,12 @@ + unsigned long iSize; + void *Base; + ++ // In case mmap can not be used, we keep a dup of the file ++ // descriptor that should have been mmaped so that we can write to ++ // the file in Sync(). ++ // ++ FileFd *fd; ++ + bool Map(FileFd &Fd); + bool Close(bool DoSync = true); +
- Previous message: [maemo-commits] r9916 - projects/haf/trunk/apt/buildlib
- Next message: [maemo-commits] r9918 - projects/haf/trunk/apt/apt-pkg/contrib
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]