00001 
00002 
#ifdef _MSC_VER
00003 
#include <io.h>
00004 
#else
00005 
00006 
#endif
00007 
00008 
00009 
#include "MemoryMap.h"
00010 
#include <plearn/base/general.h>
00011 
#include <fcntl.h>
00012 
00013 
00014 
#if !defined(_MSC_VER) && !defined(_MINGW_)
00015 
00016 
00017 
#include <sys/mman.h>
00018 
00019 
#else 
00020 
00021 
00022 
00023 
00024 
#if !defined (_MINGW_) && !defined(WIN32)
00025 
#include <varargs.h>
00026 
#else
00027 
00028 
00029 
#endif
00030 
00031 
#endif 
00032 
00033 
00034 
#include <plearn/base/general.h>
00035 
00036 
00037 
00038 
namespace PLearn {
00039 
using namespace std;
00040 
00041 
#if !(!defined(_MSC_VER) && !defined(_MINGW_))
00042 
00044 
static int fileSize(
const char *filename)
00045  {
00046   
struct stat t;
00047   stat(filename,&t);
00048   
return t.st_size;
00049  }
00050 
00052 
void * memoryMap(
const char *filename, tFileHandle & file_handle, 
bool readonly, 
int offset_, 
int length)
00053  {
00054 
#if defined(_MINGW_) || defined(WIN32)
00055 
     PLERROR(
"memoryMap() - Not supported for MINGW");
00056      
return 0;
00057 
#else
00058 
  if ((file_handle = (
tFileHandle)CreateFile( filename, 
00059                                  readonly ? GENERIC_READ: GENERIC_READ | GENERIC_WRITE, 
00060                                  readonly ? FILE_SHARE_READ : 0,
00061                                  0,
00062                                  OPEN_ALWAYS, 
00063                                  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
00064                                  0)))
00065        {
00066         
int file_size = fileSize(filename);
00067                 HANDLE map_handle = CreateFileMapping( (LPVOID)file_handle,
00068                                                    0,
00069                                                    readonly ? PAGE_READONLY : PAGE_READWRITE,
00070                                                    0, 
00071                                                    file_size,
00072                                                    0);
00073                 
if (map_handle)
00074              
return (LPVOID) MapViewOfFile( map_handle,
00075                                             readonly ? FILE_MAP_READ : FILE_MAP_WRITE,
00076                                             0, 
00077                                             offset_, 
00078                                             length ? length : file_size-offset_);
00079         
else {
00080               
PLERROR(
"In Storage: Could not open specified memory-mapping file for reading");
00081               
return 0; 
00082              }
00083        } 
00084   
else {
00085         
PLERROR(
"In Storage: Could not open specified memory-mapping file for reading");
00086         
return 0; 
00087        }
00088 
#endif
00089 
 }
00090 
00092 
bool memoryUnmap(
void * p, tFileHandle file_handle)
00093  {   
00094 
#if defined(_MINGW_) || defined(WIN32)
00095 
     PLERROR(
"memoryUnmap - Not supported for MINGW");
00096      
return false;
00097 
#else
00098 
  
00099   
00100   
00101   
if ((
bool)FlushViewOfFile(p,0))       
00102        {
00103         
00104         
bool b=UnmapViewOfFile(p); 
00105         CloseHandle((LPVOID)file_handle);
00106         
return b;
00107        }
00108   
else return false;
00109 
#endif
00110 
 }
00111 
00112 
00113 
#else // fin de version windows
00114 
00116 void * 
MemoryMap(
const char *filename,
tFileHandle & handle, 
bool read_only,  off_t & filesize)
00117  {
00118   
void * addr;
00119   
if (read_only)
00120        {
00121         handle = 
open(filename,O_RDONLY);
00122         
if (handle<0)
00123            
PLERROR(
"In Storage: Could not open specified memory-mapping file for reading");
00124         
00125         
filesize = lseek(handle,0,SEEK_END);
00126         addr = mmap(0, 
filesize, PROT_READ, MAP_SHARED, handle, 0);
00127        }
00128   
else {
00129         
int handle = 
open(filename,O_RDWR);
00130         
if (handle<0)
00131            
PLERROR(
"In Storage: Could not open specified memory-mapping file for read-write");
00132         
filesize = lseek(handle,0,SEEK_END); 
00133 
00134         addr = mmap(0, 
filesize, PROT_READ|PROT_WRITE, MAP_SHARED, handle, 0);
00135      }
00136   
return addr;
00137  }
00138 
00140 
00141 void memoryUnmap(
void * data, 
tFileHandle handle, 
int length)
00142  {
00143    msync((
char*)data, length, MS_SYNC);
00144    munmap((
char *)data, length);
00145    close(handle);
00146  }
00147 
00148 
#endif  // version linux
00149 
00150 }