2010-03-03 Gonzalo Paniagua Javier <gonzalo@novell.com>
[mono.git] / mono / utils / mono-codeman.c
index bad85585fb11f806740aeec3eb06f2bd98e482c4..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
@@ -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
         */