domain->runtime_info = NULL;
}
-#ifdef MONO_ARCH_HAVE_CODE_CHUNK_TRACKING
-
-static void
-code_manager_chunk_new (void *chunk, int size)
-{
- mono_arch_code_chunk_new (chunk, size);
-}
-
-static void
-code_manager_chunk_destroy (void *chunk)
-{
- mono_arch_code_chunk_destroy (chunk);
-}
-
-#endif
-
#ifdef ENABLE_LLVM
static gboolean
llvm_init_inner (void)
MonoDomain *domain;
MonoRuntimeCallbacks callbacks;
MonoThreadInfoRuntimeCallbacks ticallbacks;
- MonoCodeManagerCallbacks code_manager_callbacks;
MONO_VES_INIT_BEGIN ();
mono_code_manager_init ();
- memset (&code_manager_callbacks, 0, sizeof (code_manager_callbacks));
#ifdef MONO_ARCH_HAVE_CODE_CHUNK_TRACKING
- code_manager_callbacks.chunk_new = code_manager_chunk_new;
- code_manager_callbacks.chunk_destroy = code_manager_chunk_destroy;
-#endif
+
+ static const MonoCodeManagerCallbacks code_manager_callbacks = {
+
+#undef MONO_CODE_MANAGER_CALLBACK
+#define MONO_CODE_MANAGER_CALLBACK(ret, name, sig) mono_arch_code_ ## name,
+ MONO_CODE_MANAGER_CALLBACKS
+
+ };
+
mono_code_manager_install_callbacks (&code_manager_callbacks);
+#endif
mono_hwcap_init ();
static size_t dynamic_code_alloc_count;
static size_t dynamic_code_bytes_count;
static size_t dynamic_code_frees_count;
-static MonoCodeManagerCallbacks code_manager_callbacks;
+static const MonoCodeManagerCallbacks *code_manager_callbacks;
/*
* AMD64 processors maintain icache coherency only for pages which are
}
void
-mono_code_manager_install_callbacks (MonoCodeManagerCallbacks* callbacks)
+mono_code_manager_install_callbacks (const MonoCodeManagerCallbacks* callbacks)
{
- code_manager_callbacks = *callbacks;
+ code_manager_callbacks = callbacks;
}
/**
for (; chunk; ) {
dead = chunk;
MONO_PROFILER_RAISE (jit_chunk_destroyed, ((mono_byte *) dead->data));
- if (code_manager_callbacks.chunk_destroy)
- code_manager_callbacks.chunk_destroy ((gpointer)dead->data);
+ if (code_manager_callbacks)
+ code_manager_callbacks->chunk_destroy (dead->data);
chunk = chunk->next;
if (dead->flags == CODE_FLAG_MMAP) {
codechunk_vfree (dead->data, dead->size);
chunk->flags = flags;
chunk->pos = bsize;
chunk->bsize = bsize;
- if (code_manager_callbacks.chunk_new)
- code_manager_callbacks.chunk_new ((gpointer)chunk->data, chunk->size);
+ if (code_manager_callbacks)
+ code_manager_callbacks->chunk_new (chunk->data, chunk->size);
MONO_PROFILER_RAISE (jit_chunk_created, ((mono_byte *) chunk->data, chunk->size));
code_memory_used += chunk_size;
typedef struct _MonoCodeManager MonoCodeManager;
+#define MONO_CODE_MANAGER_CALLBACKS \
+ MONO_CODE_MANAGER_CALLBACK (void, chunk_new, (void *chunk, int size)) \
+ MONO_CODE_MANAGER_CALLBACK (void, chunk_destroy, (void *chunk)) \
+
typedef struct {
- void (*chunk_new) (void *chunk, int size);
- void (*chunk_destroy) (void *chunk);
+
+#undef MONO_CODE_MANAGER_CALLBACK
+#define MONO_CODE_MANAGER_CALLBACK(ret, name, sig) ret (*name) sig;
+
+ MONO_CODE_MANAGER_CALLBACKS
+
} MonoCodeManagerCallbacks;
MonoCodeManager* mono_code_manager_new (void);
int mono_code_manager_size (MonoCodeManager *cman, int *used_size);
void mono_code_manager_init (void);
void mono_code_manager_cleanup (void);
-void mono_code_manager_install_callbacks (MonoCodeManagerCallbacks* callbacks);
+void mono_code_manager_install_callbacks (const MonoCodeManagerCallbacks* callbacks);
/* find the extra block allocated to resolve branches close to code */
typedef int (*MonoCodeManagerFunc) (void *data, int csize, int size, void *user_data);