// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: mmap.h,v 1.4 1998/07/12 23:58:51 jgg Exp $
+// $Id: mmap.h,v 1.12 2001/05/14 05:16:43 jgg Exp $
/* ######################################################################
MMap Class - Provides 'real' mmap or a faked mmap using read().
##################################################################### */
/*}}}*/
-// Header section: pkglib
#ifndef PKGLIB_MMAP_H
#define PKGLIB_MMAP_H
-#ifdef __GNUG__
-#pragma interface "apt-pkg/mmap.h"
-#endif
#include <string>
#include <apt-pkg/fileutl.h>
+using std::string;
+
+/* 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
+ instead of this internal type */
+typedef unsigned int map_ptrloc;
+
class MMap
{
protected:
- File &Fd;
- unsigned long Flags;
+ unsigned long Flags;
unsigned long iSize;
void *Base;
- bool Map();
- bool Close(bool DoClose = true);
+ bool Map(FileFd &Fd);
+ bool Close(bool DoSync = true);
public:
- enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2)};
+ enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2),
+ UnMapped = (1<<3)};
// Simple accessors
inline operator void *() {return Base;};
bool Sync();
bool Sync(unsigned long Start,unsigned long Stop);
- MMap(File &F,unsigned long Flags);
+ MMap(FileFd &F,unsigned long Flags);
+ MMap(unsigned long Flags);
virtual ~MMap();
};
protected:
+ FileFd *Fd;
unsigned long WorkSpace;
Pool *Pools;
unsigned int PoolCount;
+
+ bool Grow();
public:
// Allocation
unsigned long RawAllocate(unsigned long Size,unsigned long Aln = 0);
unsigned long Allocate(unsigned long ItemSize);
- unsigned long WriteString(const char *String,unsigned long Len = 0);
- inline unsigned long WriteString(string S) {return WriteString(S.begin(),S.size());};
- void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
+ 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());};
+ void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
- DynamicMMap(File &F,unsigned long Flags,unsigned long WorkSpace = 1024*1024);
+ DynamicMMap(FileFd &F,unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
+ DynamicMMap(unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
virtual ~DynamicMMap();
};