void* mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle) { void *ptr; int mflags = 0; HANDLE file, mapping; int prot = mono_mmap_win_prot_from_flags (flags); mflags = FILE_MAP_READ; if (flags & MONO_MMAP_WRITE) mflags = FILE_MAP_COPY; file = (HANDLE) _get_osfhandle (fd); mapping = CreateFileMappingFromApp (file, NULL, prot, length, NULL); if (mapping == NULL) return NULL; ptr = MapViewOfFileFromApp (mapping, mflags, offset, length); if (ptr == NULL) { CloseHandle (mapping); return NULL; } *ret_handle = (void*)mapping; return ptr; }
int mono_mprotect (void *addr, size_t length, int flags) { DWORD oldprot; int prot = mono_mmap_win_prot_from_flags (flags); if (flags & MONO_MMAP_DISCARD) { VirtualFree (addr, length, MEM_DECOMMIT); VirtualAlloc (addr, length, MEM_COMMIT, prot); return 0; } return VirtualProtect (addr, length, prot, &oldprot) == 0; }
void* mono_valloc (void *addr, size_t length, int flags, MonoMemAccountType type) { void *ptr; int mflags = MEM_RESERVE|MEM_COMMIT; int prot = mono_mmap_win_prot_from_flags (flags); /* translate the flags */ if (!mono_valloc_can_alloc (length)) return NULL; ptr = VirtualAlloc (addr, length, mflags, prot); mono_account_mem (type, (ssize_t)length); return ptr; }
void* mono_valloc_aligned (size_t length, size_t alignment, int flags, MonoMemAccountType type) { int prot = mono_mmap_win_prot_from_flags (flags); char *mem = VirtualAlloc (NULL, length + alignment, MEM_RESERVE, prot); char *aligned; if (!mem) return NULL; if (!mono_valloc_can_alloc (length)) return NULL; aligned = mono_aligned_address (mem, length, alignment); aligned = VirtualAlloc (aligned, length, MEM_COMMIT, prot); g_assert (aligned); mono_account_mem (type, (ssize_t)length); return aligned; }
void* mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle) { void *ptr; int mflags = 0; HANDLE file, mapping; int prot = mono_mmap_win_prot_from_flags (flags); /* translate the flags */ /*if (flags & MONO_MMAP_PRIVATE) mflags |= MAP_PRIVATE; if (flags & MONO_MMAP_SHARED) mflags |= MAP_SHARED; if (flags & MONO_MMAP_ANON) mflags |= MAP_ANONYMOUS; if (flags & MONO_MMAP_FIXED) mflags |= MAP_FIXED; if (flags & MONO_MMAP_32BIT) mflags |= MAP_32BIT;*/ mflags = FILE_MAP_READ; if (flags & MONO_MMAP_WRITE) mflags = FILE_MAP_COPY; file = (HANDLE) _get_osfhandle (fd); mapping = CreateFileMapping (file, NULL, prot, 0, 0, NULL); if (mapping == NULL) return NULL; ptr = MapViewOfFile (mapping, mflags, 0, offset, length); if (ptr == NULL) { CloseHandle (mapping); return NULL; } *ret_handle = (void*)mapping; return ptr; }