]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/mmap.h
test if TMPDIR is accessible before using
[apt.git] / apt-pkg / contrib / mmap.h
index bde62217d8b3b311f714a51ba43e3d124c4e50bd..c1dfedf6da9b6b9d1244ec5c28414e95afc4cff1 100644 (file)
@@ -6,7 +6,7 @@
    MMap Class - Provides 'real' mmap or a faked mmap using read().
 
    The purpose of this code is to provide a generic way for clients to
    MMap Class - Provides 'real' mmap or a faked mmap using read().
 
    The purpose of this code is to provide a generic way for clients to
-   access the mmap function. In enviroments that do not support mmap
+   access the mmap function. In environments that do not support mmap
    from file fd's this function will use read and normal allocated 
    memory.
    
    from file fd's this function will use read and normal allocated 
    memory.
    
@@ -15,7 +15,7 @@
 
    The DynamicMMap class is used to help the on-disk data structure 
    generators. It provides a large allocated workspace and members
 
    The DynamicMMap class is used to help the on-disk data structure 
    generators. It provides a large allocated workspace and members
-   to allocate space from the workspace in an effecient fashion.
+   to allocate space from the workspace in an efficient fashion.
    
    This source is placed in the Public Domain, do with it what you will
    It was originally written by Jason Gunthorpe.
    
    This source is placed in the Public Domain, do with it what you will
    It was originally written by Jason Gunthorpe.
 
 
 #include <string>
 
 
 #include <string>
-#include <apt-pkg/fileutl.h>
 
 
+#ifndef APT_8_CLEANER_HEADERS
+#include <apt-pkg/fileutl.h>
 using std::string;
 using std::string;
+#endif
+
+class FileFd;
 
 /* This should be a 32 bit type, larger tyes use too much ram and smaller
    types are too small. Where ever possible 'unsigned long' should be used
 
 /* This should be a 32 bit type, larger tyes use too much ram and smaller
    types are too small. Where ever possible 'unsigned long' should be used
@@ -41,21 +45,28 @@ class MMap
    protected:
    
    unsigned long Flags;
    protected:
    
    unsigned long Flags;
-   unsigned long iSize;
+   unsigned long long iSize;
    void *Base;
 
    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 *SyncToFd;
+
    bool Map(FileFd &Fd);
    bool Close(bool DoSync = true);
    
    public:
 
    enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2),
    bool Map(FileFd &Fd);
    bool Close(bool DoSync = true);
    
    public:
 
    enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2),
-                   UnMapped = (1<<3)};
+                   UnMapped = (1<<3), Moveable = (1<<4), Fallback = (1 << 5)};
       
    // Simple accessors
    inline operator void *() {return Base;};
    inline void *Data() {return Base;}; 
       
    // Simple accessors
    inline operator void *() {return Base;};
    inline void *Data() {return Base;}; 
-   inline unsigned long Size() {return iSize;};
+   inline unsigned long long Size() {return iSize;};
+   inline void AddSize(unsigned long long const size) {iSize += size;};
+   inline bool validData() const { return Base != (void *)-1 && Base != 0; };
    
    // File manipulators
    bool Sync();
    
    // File manipulators
    bool Sync();
@@ -82,6 +93,8 @@ class DynamicMMap : public MMap
    
    FileFd *Fd;
    unsigned long WorkSpace;
    
    FileFd *Fd;
    unsigned long WorkSpace;
+   unsigned long const GrowFactor;
+   unsigned long const Limit;
    Pool *Pools;
    unsigned int PoolCount;
 
    Pool *Pools;
    unsigned int PoolCount;
 
@@ -90,14 +103,16 @@ class DynamicMMap : public MMap
    public:
 
    // Allocation
    public:
 
    // Allocation
-   unsigned long RawAllocate(unsigned long Size,unsigned long Aln = 0);
+   unsigned long RawAllocate(unsigned long long Size,unsigned long Aln = 0);
    unsigned long Allocate(unsigned long ItemSize);
    unsigned long WriteString(const char *String,unsigned long Len = (unsigned long)-1);
    unsigned long Allocate(unsigned long ItemSize);
    unsigned long WriteString(const char *String,unsigned long Len = (unsigned long)-1);
-   inline unsigned long WriteString(const string &S) {return WriteString(S.c_str(),S.length());};
+   inline unsigned long WriteString(const std::string &S) {return WriteString(S.c_str(),S.length());};
    void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
    
    void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
    
-   DynamicMMap(FileFd &F,unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
-   DynamicMMap(unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
+   DynamicMMap(FileFd &F,unsigned long Flags,unsigned long const &WorkSpace = 2*1024*1024,
+              unsigned long const &Grow = 1024*1024, unsigned long const &Limit = 0);
+   DynamicMMap(unsigned long Flags,unsigned long const &WorkSpace = 2*1024*1024,
+              unsigned long const &Grow = 1024*1024, unsigned long const &Limit = 0);
    virtual ~DynamicMMap();
 };
 
    virtual ~DynamicMMap();
 };