X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-mmap.c;h=6caf9628380f2f3ab8cab48c096dd5a913286e17;hb=09bd8381163fa55ed8db934637958b91debbd48b;hp=412a23b3fff33713e20a6b18489384fc19d1a32b;hpb=0146859e63468733659e108f7e8e4255e9ae0027;p=mono.git diff --git a/mono/utils/mono-mmap.c b/mono/utils/mono-mmap.c index 412a23b3fff..6caf9628380 100644 --- a/mono/utils/mono-mmap.c +++ b/mono/utils/mono-mmap.c @@ -29,6 +29,7 @@ #endif #include "mono-mmap.h" +#include "mono-mmap-internal.h" #include "mono-proclib.h" #ifndef MAP_ANONYMOUS @@ -65,8 +66,8 @@ malloc_shared_area (int pid) static char* aligned_address (char *mem, size_t size, size_t alignment) { - char *aligned = (char*)((gulong)(mem + (alignment - 1)) & ~(alignment - 1)); - g_assert (aligned >= mem && aligned + size <= mem + size + alignment && !((gulong)aligned & (alignment - 1))); + char *aligned = (char*)((size_t)(mem + (alignment - 1)) & ~(alignment - 1)); + g_assert (aligned >= mem && aligned + size <= mem + size + alignment && !((size_t)aligned & (alignment - 1))); return aligned; } @@ -107,7 +108,7 @@ void* mono_valloc (void *addr, size_t length, int flags) { void *ptr; - int mflags = MEM_COMMIT; + int mflags = MEM_RESERVE|MEM_COMMIT; int prot = prot_from_flags (flags); /* translate the flags */ @@ -243,6 +244,12 @@ mono_shared_area_instances (void **array, int count) return 0; } +int +mono_pages_not_faulted (void *addr, size_t length) +{ + return -1; +} + #else #if defined(HAVE_MMAP) @@ -308,13 +315,13 @@ mono_valloc (void *addr, size_t length, int flags) mflags |= MAP_PRIVATE; ptr = mmap (addr, length, prot, mflags, -1, 0); - if (ptr == (void*)-1) { + if (ptr == MAP_FAILED) { int fd = open ("/dev/zero", O_RDONLY); if (fd != -1) { ptr = mmap (addr, length, prot, mflags, fd, 0); close (fd); } - if (ptr == (void*)-1) + if (ptr == MAP_FAILED) return NULL; } return ptr; @@ -368,7 +375,7 @@ mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_hand mflags |= MAP_32BIT; ptr = mmap (0, length, prot, mflags, fd, offset); - if (ptr == (void*)-1) + if (ptr == MAP_FAILED) return NULL; *ret_handle = (void*)length; return ptr; @@ -405,6 +412,20 @@ mono_file_unmap (void *addr, void *handle) * * Returns: 0 on success. */ +#if defined(__native_client__) +int +mono_mprotect (void *addr, size_t length, int flags) +{ + int prot = prot_from_flags (flags); + void *new_addr; + + if (flags & MONO_MMAP_DISCARD) memset (addr, 0, length); + + new_addr = mmap(addr, length, prot, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0); + if (new_addr == addr) return 0; + return -1; +} +#else int mono_mprotect (void *addr, size_t length, int flags) { @@ -427,6 +448,31 @@ mono_mprotect (void *addr, size_t length, int flags) } return mprotect (addr, length, prot); } +#endif // __native_client__ + +int +mono_pages_not_faulted (void *addr, size_t size) +{ + int i; + gint64 count; + int pagesize = mono_pagesize (); + int npages = (size + pagesize - 1) / pagesize; + char *faulted = g_malloc0 (sizeof (char*) * npages); + + if (mincore (addr, size, faulted) != 0) { + count = -1; + } else { + count = 0; + for (i = 0; i < npages; ++i) { + if (faulted [i] != 0) + ++count; + } + } + + g_free (faulted); + + return count; +} #else @@ -466,8 +512,17 @@ mono_mprotect (void *addr, size_t length, int flags) } return 0; } + +int +mono_pages_not_faulted (void *addr, size_t length) +{ + return -1; +} + #endif // HAVE_MMAP +#if defined(HAVE_SHM_OPEN) && !defined (DISABLE_SHARED_PERFCOUNTERS) + static int use_shared_area; static gboolean @@ -476,13 +531,12 @@ shared_area_disabled (void) if (!use_shared_area) { if (g_getenv ("MONO_DISABLE_SHARED_AREA")) use_shared_area = -1; - use_shared_area = 1; + else + use_shared_area = 1; } return use_shared_area == -1; } -#if defined(HAVE_SHM_OPEN) && !defined (DISABLE_SHARED_PERFCOUNTERS) - static int mono_shared_area_instances_slow (void **array, int count, gboolean cleanup) {