diff options
Diffstat (limited to 'Build/source/libs/zziplib/zziplib-src/zzip/__mmap.h')
-rw-r--r-- | Build/source/libs/zziplib/zziplib-src/zzip/__mmap.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/Build/source/libs/zziplib/zziplib-src/zzip/__mmap.h b/Build/source/libs/zziplib/zziplib-src/zzip/__mmap.h new file mode 100644 index 00000000000..5dfc45dcda2 --- /dev/null +++ b/Build/source/libs/zziplib/zziplib-src/zzip/__mmap.h @@ -0,0 +1,124 @@ +#ifndef __ZZIP_INTERNAL_MMAP_H +#define __ZZIP_INTERNAL_MMAP_H +#include <zzip/types.h> + +/* + * DO NOT USE THIS CODE. + * + * It is an internal header file for zziplib that carries some inline + * functions (or just static members) and a few defines, simply to be + * able to reuse these across - and have everything in a specific place. + * + * Copyright (c) 2002,2003 Guido Draheim + * All rights reserved, + * use under the restrictions of the + * Lesser GNU General Public License + * or alternatively the restrictions + * of the Mozilla Public License 1.1 + */ + +#ifdef _USE_MMAP +#if defined ZZIP_HAVE_SYS_MMAN_H +#include <sys/mman.h> +#define USE_POSIX_MMAP 1 +#elif defined ZZIP_HAVE_WINBASE_H || defined WIN32 +#include <windows.h> +#define USE_WIN32_MMAP 1 +#else +#undef _USE_MMAP +#endif +#endif + +/* -------------- specify MMAP function imports --------------------------- */ + +#if defined USE_POSIX_MMAP +#define USE_MMAP 1 + +#define _zzip_mmap(user, fd, offs, len) \ + mmap (0, len, PROT_READ, MAP_SHARED, fd, offs) +#define _zzip_munmap(user, ptr, len) \ + munmap (ptr, len) +#define _zzip_getpagesize(user) getpagesize() + +#ifndef MAP_FAILED /* hpux10.20 does not have it */ +#define MAP_FAILED ((void*)(-1)) +#endif + +#elif defined USE_WIN32_MMAP +#define USE_MMAP 1 +#ifndef MAP_FAILED +#define MAP_FAILED 0 +#endif +/* we (ab)use the "*user" variable to store the FileMapping handle */ + /* and make sure (sizeof(*user) == sizeof(HANDLE)) */ + +static size_t win32_getpagesize (void) +{ + SYSTEM_INFO si; GetSystemInfo (&si); + return si.dwAllocationGranularity; +} +#ifdef _WIN64 +static void* win32_mmap (__int64* user, int fd, zzip_off_t offs, size_t len) +#else +static void* win32_mmap (long* user, int fd, zzip_off_t offs, size_t len) +#endif +{ + if (! user || *user != 1) /* || offs % getpagesize() */ + return 0; + { + HANDLE hFile = (HANDLE)_get_osfhandle(fd); + if (hFile) +#ifdef _WIN64 + *user = (__int64) CreateFileMapping (hFile, 0, PAGE_READONLY, 0, 0, NULL); +#else + *user = (long) CreateFileMapping (hFile, 0, PAGE_READONLY, 0, 0, NULL); +#endif + if (*user) + { + char* p = 0; + p = MapViewOfFile(*(HANDLE*)user, FILE_MAP_READ, 0, offs, len); + if (p) return p; + CloseHandle (*(HANDLE*)user); *user = 1; + } + return MAP_FAILED; + } +} +#ifdef _WIN64 +static void win32_munmap (__int64* user, char* fd_map, size_t len) +#else +static void win32_munmap (long* user, char* fd_map, size_t len) +#endif +{ + UnmapViewOfFile (fd_map); + CloseHandle (*(HANDLE*)user); *user = 1; +} +#ifdef _WIN64 +#define _zzip_mmap(user, fd, offs, len) \ + win32_mmap ((__int64*) &(user), fd, offs, len) +#define _zzip_munmap(user, ptr, len) \ + win32_munmap ((__int64*) &(user), ptr, len) +#else +#define _zzip_mmap(user, fd, offs, len) \ + win32_mmap ((long*) &(user), fd, offs, len) +#define _zzip_munmap(user, ptr, len) \ + win32_munmap ((long*) &(user), ptr, len) +#endif +#define _zzip_getpagesize(user) win32_getpagesize() +#else /* disable */ +#define USE_MMAP 0 +/* USE_MAP is intentional: we expect the compiler to do some "code removal" + * on any source code enclosed in if (USE_MMAP) {...} i.e. the unreachable + * branch of an if (0) {....} is not emitted to the final object binary. */ + +#ifndef MAP_FAILED +#define MAP_FAILED 0 +#endif + +#define _zzip_mmap(user, fd, offs, len) (MAP_FAILED) +#define _zzip_munmap(user, ptr, len) {} +#define _zzip_getpagesize(user) 1 + +#endif /* USE_MMAP defines */ + + +#endif |