Readonly codemanager callbacks. (mono/mono#15538)
authorJay Krell <jaykrell@microsoft.com>
Fri, 5 Jul 2019 13:46:10 +0000 (06:46 -0700)
committerBernhard Urban <lewurm@gmail.com>
Fri, 5 Jul 2019 13:46:10 +0000 (15:46 +0200)
Commit migrated from https://github.com/mono/mono/commit/4cf527f6d9ce224c8d1972c95e212f74a0c91043

src/mono/mono/mini/mini-runtime.c
src/mono/mono/utils/mono-codeman.c
src/mono/mono/utils/mono-codeman.h

index 7179fe2..3ee046f 100644 (file)
@@ -3966,22 +3966,6 @@ mini_free_jit_domain_info (MonoDomain *domain)
        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)
@@ -4086,7 +4070,6 @@ mini_init (const char *filename, const char *runtime_version)
        MonoDomain *domain;
        MonoRuntimeCallbacks callbacks;
        MonoThreadInfoRuntimeCallbacks ticallbacks;
-       MonoCodeManagerCallbacks code_manager_callbacks;
 
        MONO_VES_INIT_BEGIN ();
 
@@ -4198,12 +4181,18 @@ mini_init (const char *filename, const char *runtime_version)
 
        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 ();
 
index 973ccc2..6bc0d0b 100644 (file)
@@ -31,7 +31,7 @@ static uintptr_t code_memory_used = 0;
 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 
@@ -179,9 +179,9 @@ mono_code_manager_cleanup (void)
 }
 
 void
-mono_code_manager_install_callbacks (MonoCodeManagerCallbacks* callbacks)
+mono_code_manager_install_callbacks (const MonoCodeManagerCallbacks* callbacks)
 {
-       code_manager_callbacks = *callbacks;
+       code_manager_callbacks = callbacks;
 }
 
 /**
@@ -236,8 +236,8 @@ free_chunklist (CodeChunk *chunk)
        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);
@@ -421,8 +421,8 @@ new_codechunk (CodeChunk *last, int dynamic, int 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;
index 3128bdf..65f0a8a 100644 (file)
@@ -9,9 +9,17 @@
 
 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);
@@ -29,7 +37,7 @@ void             mono_code_manager_commit  (MonoCodeManager *cman, void *data, i
 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);