00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef PKGLIB_MMAP_H
00026 #define PKGLIB_MMAP_H
00027
00028
00029 #include <string>
00030 #include <apt-pkg/fileutl.h>
00031
00032 using std::string;
00033
00034
00035
00036
00037 typedef unsigned int map_ptrloc;
00038
00039 class MMap
00040 {
00041 protected:
00042
00043 unsigned long Flags;
00044 unsigned long iSize;
00045 void *Base;
00046
00047
00048
00049
00050 FileFd *SyncToFd;
00051
00052 bool Map(FileFd &Fd);
00053 bool Close(bool DoSync = true);
00054
00055 public:
00056
00057 enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2),
00058 UnMapped = (1<<3), Moveable = (1<<4), Fallback = (1 << 5)};
00059
00060
00061 inline operator void *() {return Base;};
00062 inline void *Data() {return Base;};
00063 inline unsigned long Size() {return iSize;};
00064
00065
00066 bool Sync();
00067 bool Sync(unsigned long Start,unsigned long Stop);
00068
00069 MMap(FileFd &F,unsigned long Flags);
00070 MMap(unsigned long Flags);
00071 virtual ~MMap();
00072 };
00073
00074 class DynamicMMap : public MMap
00075 {
00076 public:
00077
00078
00079 struct Pool
00080 {
00081 unsigned long ItemSize;
00082 unsigned long Start;
00083 unsigned long Count;
00084 };
00085
00086 protected:
00087
00088 FileFd *Fd;
00089 unsigned long WorkSpace;
00090 unsigned long const GrowFactor;
00091 unsigned long const Limit;
00092 Pool *Pools;
00093 unsigned int PoolCount;
00094
00095 bool Grow();
00096
00097 public:
00098
00099
00100 unsigned long RawAllocate(unsigned long Size,unsigned long Aln = 0);
00101 unsigned long Allocate(unsigned long ItemSize);
00102 unsigned long WriteString(const char *String,unsigned long Len = (unsigned long)-1);
00103 inline unsigned long WriteString(const string &S) {return WriteString(S.c_str(),S.length());};
00104 void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
00105
00106 DynamicMMap(FileFd &F,unsigned long Flags,unsigned long const &WorkSpace = 2*1024*1024,
00107 unsigned long const &Grow = 1024*1024, unsigned long const &Limit = 0);
00108 DynamicMMap(unsigned long Flags,unsigned long const &WorkSpace = 2*1024*1024,
00109 unsigned long const &Grow = 1024*1024, unsigned long const &Limit = 0);
00110 virtual ~DynamicMMap();
00111 };
00112
00113 #endif