[mini] Support loading multiple profilers with the --profile option.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Mon, 17 Jul 2017 20:59:26 +0000 (22:59 +0200)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Mon, 17 Jul 2017 21:35:20 +0000 (23:35 +0200)
The runtime has ~always supported having multiple profilers loaded, so it
didn't make much sense that only the last --profile option given would be used.

mono/mini/driver.c
mono/mini/mini-runtime.c
mono/mini/mini.h

index 750aa206b992f47a3edd1f041041b090c3e04068..6f977ecb37d990a586d3c92344b9c54c83659ce1 100644 (file)
@@ -1584,9 +1584,7 @@ mono_main (int argc, char* argv[])
        guint32 opt, action = DO_EXEC, recompilation_times = 1;
        MonoGraphOptions mono_graph_options = (MonoGraphOptions)0;
        int mini_verbose = 0;
-       gboolean enable_profile = FALSE;
        char *trace_options = NULL;
-       char *profile_options = NULL;
        char *aot_options = NULL;
        char *forced_version = NULL;
        GPtrArray *agents = NULL;
@@ -1797,11 +1795,9 @@ mono_main (int argc, char* argv[])
                } else if (strcmp (argv [i], "--jitmap") == 0) {
                        mono_enable_jit_map ();
                } else if (strcmp (argv [i], "--profile") == 0) {
-                       enable_profile = TRUE;
-                       profile_options = NULL;
+                       mini_add_profiler_argument (NULL);
                } else if (strncmp (argv [i], "--profile=", 10) == 0) {
-                       enable_profile = TRUE;
-                       profile_options = argv [i] + 10;
+                       mini_add_profiler_argument (argv [i] + 10);
                } else if (strncmp (argv [i], "--agent=", 8) == 0) {
                        if (agents == NULL)
                                agents = g_ptr_array_new ();
@@ -2011,10 +2007,6 @@ mono_main (int argc, char* argv[])
        /* Set rootdir before loading config */
        mono_set_rootdir ();
 
-       if (enable_profile) {
-               mini_profiler_enable_with_options (profile_options);
-       }
-
        mono_attach_parse_options (attach_options);
 
        if (trace_options != NULL){
index 8e385be0afca28fdce9979df8201258d1ce3051c..f3995858181cd1595754e3988592d353dcc9044d 100644 (file)
@@ -130,16 +130,12 @@ int valgrind_register;
 #endif
 GList* mono_aot_paths;
 
-static gboolean mini_enable_profiler = FALSE;
-static char* mini_profiler_options = NULL;
+static GPtrArray *profile_options;
 
 static GSList *tramp_infos;
 
 static void register_icalls (void);
 
-static gboolean mini_profiler_enabled (void) { return mini_enable_profiler; }
-static const char* mini_profiler_get_options (void) {  return mini_profiler_options;  }
-
 gboolean
 mono_running_on_valgrind (void)
 {
@@ -3764,10 +3760,12 @@ mini_llvm_init (void)
 }
 
 void
-mini_profiler_enable_with_options (const char* profile_options)
+mini_add_profiler_argument (const char *desc)
 {
-       mini_enable_profiler = TRUE;
-       mini_profiler_options = g_strdup (profile_options);
+       if (!profile_options)
+               profile_options = g_ptr_array_new ();
+
+       g_ptr_array_add (profile_options, (gpointer) desc);
 }
 
 MonoDomain *
@@ -3940,8 +3938,9 @@ mini_init (const char *filename, const char *runtime_version)
        mono_install_get_class_from_name (mono_aot_get_class_from_name);
        mono_install_jit_info_find_in_aot (mono_aot_find_jit_info);
 
-       if (mini_profiler_enabled ())
-               mono_profiler_load (mini_profiler_get_options ());
+       if (profile_options)
+               for (guint i = 0; i < profile_options->len; i++)
+                       mono_profiler_load ((const char *) g_ptr_array_index (profile_options, i));
 
        mono_profiler_started ();
 
@@ -4384,6 +4383,9 @@ mini_cleanup (MonoDomain *domain)
 
        mono_profiler_cleanup ();
 
+       if (profile_options)
+               g_ptr_array_free (profile_options, TRUE);
+
        free_jit_tls_data ((MonoJitTlsData *)mono_tls_get_jit_tls ());
 
        mono_icall_cleanup ();
index fea3746e5dac50a59ba8071bdec9f635a84f2dd5..455929e5ea943115d1eb9a6f5984fbe50b260f48 100644 (file)
@@ -2346,7 +2346,7 @@ MonoDomain* mini_init                      (const char *filename, const char *ru
 void        mini_cleanup                   (MonoDomain *domain);
 MONO_API MonoDebugOptions *mini_get_debug_options   (void);
 MONO_API gboolean    mini_parse_debug_option (const char *option);
-void        mini_profiler_enable_with_options (const char *profile_options);
+void        mini_add_profiler_argument (const char *desc);
 
 /* graph dumping */
 void mono_cfg_dump_create_context (MonoCompile *cfg);