/* $Id$ * ============================================================================= * * = LIBRARY * pace * * = FILENAME * pace/win32/mman.c * * = AUTHOR * Luther Baker * * ============================================================================= */ #include "mman.h" void * mmap (void *addr, size_t len, int prot, int flags, HANDLE fildes, long off) { void *addr_mapping = 0; int nt_flags = 0; HANDLE file_mapping = INVALID_HANDLE_VALUE; if (flags | MAP_PRIVATE) { prot = PAGE_WRITECOPY; nt_flags = FILE_MAP_COPY; } else if (flags | MAP_SHARED) { if (prot | PAGE_READONLY) nt_flags = FILE_MAP_READ; if (prot | PAGE_READWRITE) nt_flags = FILE_MAP_WRITE; } file_mapping = CreateFileMapping (fildes, 0, prot, 0, 0, 0); if (file_mapping == 0) return MAP_FAILED; # if defined (PACE_OS_EXTRA_MMAP_FLAGS) nt_flags |= PACE_OS_EXTRA_MMAP_FLAGS; # endif /* PACE_OS_EXTRA_MMAP_FLAGS */ //ACE_UNUSED_ARG (addr); /* WinCE does not allow specifying <addr>.*/ addr_mapping = MapViewOfFile (file_mapping, nt_flags, 0, off, len); /* Only close this down if we used the temporary. */ if (file_mapping == INVALID_HANDLE_VALUE) CloseHandle (file_mapping); if (addr_mapping == 0) return MAP_FAILED; else if ((flags | MAP_FIXED) && addr_mapping != addr) { errno = 22; return MAP_FAILED; } else return addr_mapping; } int mprotect (void *addr, size_t len, int prot) { DWORD dummy; /* Sigh! */ return VirtualProtect (addr, len, prot, &dummy) ? 0 : -1; } int msync (void *addr, size_t len, int flags) { //PACE_UNUSED_ARG (flags); if (!FlushViewOfFile (addr, len)) return -1; return 0; } int munmap (void *addr, size_t len) { //PACE_UNUSED_ARG (len); if (!UnmapViewOfFile (addr)) return -1; return 0; }