SeqPoint are now kept in memory with a compact encoding.
[mono.git] / mono / utils / mono-mmap.c
index 412a23b3fff33713e20a6b18489384fc19d1a32b..6caf9628380f2f3ab8cab48c096dd5a913286e17 100644 (file)
@@ -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)
 {