#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
struct _MonoCodeManager {
int dynamic;
+ int read_only;
CodeChunk *current;
CodeChunk *full;
};
cman->current = NULL;
cman->full = NULL;
cman->dynamic = 0;
+ cman->read_only = 0;
return cman;
}
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);
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
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;
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
*/