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
00026
00027 #ifndef OPENMS_SYSTEM_MEMORYMAP_H
00028 #define OPENMS_SYSTEM_MEMORYMAP_H
00029
00030 #include <OpenMS/CONCEPT/Types.h>
00031
00032 #define OPENMS_MUNMAP_FAILURE (-1)
00033
00034 #ifdef OPENMS_WINDOWSPLATFORM
00035 #include <Windows.h>
00036 #define MAP_FAILED ((void *) -1)
00037 #else
00038
00039 #include <sys/mman.h>
00040 #endif
00041
00042
00043
00044 #if defined __APPLE__ & defined __MACH__
00045 #define mmap64 mmap
00046 #endif
00047
00048 namespace OpenMS
00049 {
00050
00051
00057 class MemoryMap
00058 {
00059 public:
00060
00061
00062 static std::size_t OpenMS_getFileBlocksize (void)
00063 {
00064 static std::size_t g_pagesize = 0;
00065 if (! g_pagesize)
00066 {
00067 #ifdef OPENMS_WINDOWSPLATFORM
00068 SYSTEM_INFO system_info;
00069 GetSystemInfo (&system_info);
00070 g_pagesize = system_info.dwAllocationGranularity;
00071 #else
00072 g_pagesize = getpagesize();
00073 #endif
00074 }
00075 return g_pagesize;
00076 }
00077
00078
00079 #ifdef OPENMS_WINDOWSPLATFORM
00080
00081 static void* OpenMS_mmap (const std::size_t& size, const HANDLE& handle, const Offset64Int& file_offset)
00082 {
00083
00084
00085
00086
00087 LARGE_INTEGER iTmp1;
00088 iTmp1.QuadPart = file_offset + (Offset64Int)size;
00089 DWORD hi1 = iTmp1.HighPart;
00090 DWORD lo1 = iTmp1.LowPart;
00091
00092
00093 HANDLE mmapHandle_ = CreateFileMapping(handle,
00094 NULL,
00095 PAGE_READWRITE,
00096 hi1,
00097 lo1,
00098 NULL
00099 );
00100 LPVOID map;
00101 if (mmapHandle_ == NULL)
00102 {
00103 map = MAP_FAILED;
00104 return map;
00105 }
00106
00107
00108
00109 LARGE_INTEGER iTmp;
00110 iTmp.QuadPart = file_offset;
00111 DWORD hi = iTmp.HighPart;
00112 DWORD lo = iTmp.LowPart;
00113
00114
00115
00116 map = MapViewOfFile(
00117 mmapHandle_,
00118 FILE_MAP_ALL_ACCESS,
00119 hi,
00120 lo,
00121 size
00122 );
00123
00124
00125 CloseHandle(mmapHandle_);
00126
00127 if (map == NULL)
00128 {
00129 map = MAP_FAILED;
00130 }
00131 return map;
00132
00133 }
00134 #else
00135 static void* OpenMS_mmap (const std::size_t& size, const int& fileHandle, const Offset64Int& file_offset)
00136 {
00137
00138 void* map = mmap64(0,
00139 size,
00140 PROT_READ | PROT_WRITE,
00141 MAP_SHARED,
00142 fileHandle,
00143 file_offset
00144 );
00145 return map;
00146 }
00147 #endif
00148
00149
00152 static int OpenMS_unmap (void* p, const std::size_t& bytes)
00153 {
00154 #ifdef OPENMS_WINDOWSPLATFORM
00155 int result = UnmapViewOfFile(p);
00156 if (result == 0) result = OPENMS_MUNMAP_FAILURE;
00157 #else
00158 int result = munmap(p, bytes);
00159 #endif
00160 return result;
00161 }
00162
00163
00164
00165 };
00166
00167
00168 }
00169
00170 #undef MAP_TYPE //this is a MACRO defined in mmap.h and conflicts with CGAL, which uses "MAP_TYPE" in an internal class as TEMPLATE parameter!
00171
00172
00173 #endif // OPENMS_SYSTEM_MEMORYMAP_H