2009-10-31 Gonzalo Paniagua Javier <gonzalo@novell.com>
[mono.git] / mono / utils / mono-codeman.c
index b8ec7b291b0e3bc5fd1f6b399dafc4f693dc3126..fcef18e0f7dcddf886182188ce19566072cb2976 100644 (file)
@@ -15,6 +15,7 @@
 #include "mono-mmap.h"
 #include "dlmalloc.h"
 #include <mono/metadata/class-internals.h>
+#include <mono/metadata/profiler-private.h>
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 #include <valgrind/memcheck.h>
 #endif
@@ -70,6 +71,7 @@ struct _CodeChunck {
 
 struct _MonoCodeManager {
        int dynamic;
+       int read_only;
        CodeChunk *current;
        CodeChunk *full;
 };
@@ -96,6 +98,7 @@ mono_code_manager_new (void)
        cman->current = NULL;
        cman->full = NULL;
        cman->dynamic = 0;
+       cman->read_only = 0;
        return cman;
 }
 
@@ -133,6 +136,7 @@ free_chunklist (CodeChunk *chunk)
 
        for (; chunk; ) {
                dead = chunk;
+               mono_profiler_code_chunk_destroy ((gpointer) dead->data);
                chunk = chunk->next;
                if (dead->flags == CODE_FLAG_MMAP) {
                        mono_vfree (dead->data, dead->size);
@@ -183,6 +187,18 @@ mono_code_manager_invalidate (MonoCodeManager *cman)
                memset (chunk->data, fill_value, chunk->size);
 }
 
+/**
+ * mono_code_manager_set_read_only:
+ * @cman: a code manager
+ *
+ * Make the code manager read only, so further allocation requests cause an assert.
+ */
+void             
+mono_code_manager_set_read_only (MonoCodeManager *cman)
+{
+       cman->read_only = TRUE;
+}
+
 /**
  * mono_code_manager_foreach:
  * @cman: a code manager
@@ -260,7 +276,7 @@ new_codechunk (int dynamic, int size)
 #endif
 
        if (flags == CODE_FLAG_MALLOC) {
-               ptr = dlmalloc (chunk_size + MIN_ALIGN - 1);
+               ptr = dlmemalign (MIN_ALIGN, chunk_size + MIN_ALIGN - 1);
                if (!ptr)
                        return NULL;
        } else {
@@ -290,6 +306,7 @@ new_codechunk (int dynamic, int size)
        chunk->flags = flags;
        chunk->pos = bsize;
        chunk->bsize = bsize;
+       mono_profiler_code_chunk_new((gpointer) chunk->data, chunk->size);
 
        /*printf ("code chunk at: %p\n", ptr);*/
        return chunk;
@@ -311,6 +328,8 @@ mono_code_manager_reserve_align (MonoCodeManager *cman, int size, int alignment)
        CodeChunk *chunk, *prev;
        void *ptr;
 
+       g_assert (!cman->read_only);
+
        /* eventually allow bigger alignments, but we need to fix the dynamic alloc code to
         * handle this before
         */