diff options
| author | pixel <pixel> | 2003-11-25 10:18:04 +0000 | 
|---|---|---|
| committer | pixel <pixel> | 2003-11-25 10:18:04 +0000 | 
| commit | 7fba30e97d12d2c9fb9cfeea0df82f5b6c0e7d52 (patch) | |
| tree | 28b72c1376a9d872f2b16c9d174bd36d29934ce5 | |
| parent | 998c8772510563a4bdf3019b188082c58b6afa0a (diff) | |
Fixed mmap
| -rw-r--r-- | include/Handle.h | 4 | ||||
| -rw-r--r-- | lib/Handle.cc | 54 | 
2 files changed, 50 insertions, 8 deletions
| diff --git a/include/Handle.h b/include/Handle.h index 64e082b..79799da 100644 --- a/include/Handle.h +++ b/include/Handle.h @@ -42,6 +42,7 @@ class Handle : public Base {      virtual void Flush();      void * mmap(off_t = 0, size_t = -1) throw (GeneralException); +    void munmap() throw (GeneralException);    protected:        Handle(int h);      int GetHandle() const; @@ -56,6 +57,9 @@ class Handle : public Base {      z_stream zstrm;      int z, c;      void * hMapObject; +    bool mapped; +    size_t maplength; +    void * mappedarea;  };  Handle & operator<<(Handle &, const String &); diff --git a/lib/Handle.cc b/lib/Handle.cc index 4b2b4f1..8ec6219 100644 --- a/lib/Handle.cc +++ b/lib/Handle.cc @@ -37,7 +37,7 @@ enum {      INFLATE  }; -Handle::Handle(const Handle & nh) : itell(0), hFile(0), h(nh.h >= 0 ? dup(nh.h) : nh.h), closed(nh.closed), nonblock(nh.closed), zfile(0), z(0) +Handle::Handle(const Handle & nh) : itell(0), hFile(0), h(nh.h >= 0 ? dup(nh.h) : nh.h), closed(nh.closed), nonblock(nh.closed), zfile(0), z(0), hMapObject(0), mapped(0)  {  #ifdef DEBUG      printm(M_INFO, String(_("Duplication of handle ")) + nh.h + _(" to ") + h + "\n"); @@ -54,7 +54,7 @@ Handle::~Handle() {      close();  } -Handle::Handle(int nh) : h(nh), closed(false), nonblock(false), zfile(0), z(0) +Handle::Handle(int nh) : h(nh), closed(false), nonblock(false), zfile(0), z(0), hMapObject(0), mapped(0)  {  #ifdef DEBUG      printm(M_INFO, String(_("Initialising handle ")) + h + "\n"); @@ -255,6 +255,10 @@ void Handle::close() throw (GeneralException) {  	hFile = 0;      }  #endif + +    if (mapped) { +	munmap(); +    }      h = -1;      closed = 1; @@ -522,16 +526,25 @@ void Handle::Flush() {  }  void * Handle::mmap(off_t offset, size_t length) throw (GeneralException) { +    void * r; +      if (h == -1) {  	throw GeneralException("Can't mmap() a virtual handle");      } +    if (mapped) { +	throw GeneralException("Handle already mmap()ped"); +    } +    mapped = true; +    maplength = length;      if (length == -1) {  	length = GetSize();      } -#ifndef _WIN32     -    return ::mmap(0, length, (CanRead() ? PROT_READ : 0) | (CanWrite() ? PROT_WRITE : 0), MAP_SHARED, h, offset); +#ifndef _WIN32 +    r = ::mmap(0, length, (CanRead() ? PROT_READ : 0) | (CanWrite() ? PROT_WRITE : 0), MAP_SHARED, h, offset); +    if (!r) { +	throw GeneralException(String("Was not able to mmap(): ") + strerror(errno)); +    }  #else -    void * lpvMem = 0;      hMapObject = CreateFileMapping(
  	hFile,
          0,
 @@ -540,16 +553,41 @@ void * Handle::mmap(off_t offset, size_t length) throw (GeneralException) {          length,
          GetName().to_charp());
      if (hMapObject != NULL) {
 -	lpvMem = MapViewOfFile( 
 +	r = MapViewOfFile( 
  	    hMapObject,
  	    CanWrite() ? FILE_MAP_WRITE : FILE_MAP_READ,
  	    0,
  	    offset,
  	    length);
 -	if (lpvMem == NULL) {
 +	if (!r) {
  	    CloseHandle(hMapObject);
 +	    throw GeneralException("Was not able to MapViewOfFile()");
  	}
 +    } else {
 +	throw GeneralException("Was not able to CreateFileMapping()");
      }
 -    return lpvMem;  #endif + +    mappedarea = r; + +    return r; +} + +void Handle::munmap() throw (GeneralException) { +    if (!mapped) { +	throw GeneralException("Can't munmap, was not mapped"); +    } +#ifndef _WIN32 +    if (::munmap(mappedarea, maplength) { +	throw GeneralException(String("Was not able to munmap(): ") + strerror(errno)); +    } +#else +    if (!UnmapViewOfFile(mappedarea)) { +	throw GeneralException("Was not able to UnmapViewOfFile()"); +    } +    CloseHandle(hMapObject);
 +#endif +    mapped = false; +    mappedarea = 0; +    maplength = 0;  } | 
