*/
#include <config.h>
+#ifdef HAVE_SIGNAL_H
#include <signal.h>
+#endif
#if HAVE_SCHED_SETAFFINITY
#include <sched.h>
#endif
#include "version.h"
#include "debugger-agent.h"
-static FILE *mini_stats_fd = NULL;
+static FILE *mini_stats_fd;
static void mini_usage (void);
need_comma = 0;
for (i = 0; i < G_N_ELEMENTS (opt_names); ++i) {
- if (flags & (1 << i)) {
+ if (flags & (1 << i) && optflag_get_name (i)) {
if (need_comma)
g_string_append_c (str, ',');
g_string_append (str, optflag_get_name (i));
} else {
cfailed++;
- if (verbose)
- g_print ("Test '%s' failed compilation.\n", method->name);
+ g_print ("Test '%s' failed compilation.\n", method->name);
}
if (mini_stats_fd)
fprintf (mini_stats_fd, "%f, ",
#ifdef HOST_WIN32
BOOL APIENTRY DllMain (HMODULE module_handle, DWORD reason, LPVOID reserved)
{
- int dummy;
if (!mono_gc_dllmain (module_handle, reason, reserved))
return FALSE;
if (g_getenv ("MONO_NO_SMP"))
mono_set_use_smp (FALSE);
- if (!g_thread_supported ())
- g_thread_init (NULL);
-
g_log_set_always_fatal (G_LOG_LEVEL_ERROR);
g_log_set_fatal_mask (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR);
g_set_prgname (argv[i]);
}
+ mono_counters_init ();
+
if (enable_profile)
mono_profiler_load (profile_options);
mono_load_coree (argv [i]);
#endif
+ /* Set rootdir before loading config */
+ mono_set_rootdir ();
+
+ /* Parse gac loading options before loading assemblies. */
+ if (mono_compile_aot || action == DO_EXEC || action == DO_DEBUGGER) {
+ mono_config_parse (config_file);
+ }
+
mono_set_defaults (mini_verbose, opt);
domain = mini_init (argv [i], forced_version);
break;
}
- /* Parse gac loading options before loading assemblies. */
- if (mono_compile_aot || action == DO_EXEC || action == DO_DEBUGGER) {
- mono_config_parse (config_file);
- }
-
#ifdef MONO_JIT_INFO_TABLE_TEST
if (test_jit_info_table)
jit_info_table_test (domain);
fprintf (stderr, "Corlib not in sync with this runtime: %s\n", error);
fprintf (stderr, "Loaded from: %s\n",
mono_defaults.corlib? mono_image_get_filename (mono_defaults.corlib): "unknown");
- fprintf (stderr, "Download a newer corlib or a newer runtime at http://www.go-mono.com/daily.\n");
+ fprintf (stderr, "Download a newer corlib or a newer runtime at http://www.mono-project.com/download.\n");
exit (1);
}
mono_thread_manage ();
#endif
- /*
- * On unix, WaitForMultipleObjects for threads is implemented by waiting on
- * a cond variable, which is set by the thread when it exits _mono code_,
- * but it could still be running libc code. On amd64, the libc thread exit
- * code does a stack unwind, and if it encounters a frame pointing to native
- * code which is in memory which is no longer mapped (because the runtime has
- * shut down), it will crash:
- * http://mail-archives.apache.org/mod_mbox/harmony-dev/200801.mbox/%3C200801130327.41572.gshimansky@apache.org%3E
- * Testcase: tests/main-exit-background-change.exe.
- * Testcase: test/main-returns-background-abort-resetabort.exe.
- * To make this race less frequent, we avoid freeing the global code manager.
- * Since mono_main () is hopefully only used by the runtime executable, this
- * will only cause a shutdown leak. This workaround also has the advantage
- * that it can be back-ported to 2.0 safely.
- * FIXME: Fix this properly by waiting for threads to really exit using
- * pthread_join (). This cannot be done currently as the io-layer calls
- * pthread_detach ().
- *
- * This used to be an amd64 only crash, but it looks like now most glibc targets do unwinding
- * that requires reading the target code.
- */
-#if defined( __linux__ ) || defined( __native_client__ )
- mono_dont_free_global_codeman = TRUE;
-#endif
-
mini_cleanup (domain);
/* Look up return value from System.Environment.ExitCode */
void
mono_jit_cleanup (MonoDomain *domain)
{
+ mono_thread_manage ();
+
mini_cleanup (domain);
}