8 * Copyright 2010 Novell, Inc (http://www.novell.com)
9 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
16 #include <mono/metadata/appdomain.h>
17 #include <mono/metadata/class.h>
18 #include <mono/metadata/class-internals.h>
19 #include <mono/metadata/runtime.h>
20 #include <mono/metadata/monitor.h>
21 #include <mono/metadata/threads-types.h>
22 #include <mono/metadata/threadpool.h>
23 #include <mono/metadata/marshal.h>
24 #include <mono/utils/atomic.h>
26 static gboolean shutting_down_inited = FALSE;
27 static gboolean shutting_down = FALSE;
30 * mono_runtime_set_shutting_down:
31 * \deprecated This function can break the shutdown sequence.
33 * Invoked by \c System.Environment.Exit to flag that the runtime
37 mono_runtime_set_shutting_down (void)
43 * mono_runtime_is_shutting_down:
44 * This is consumed by the \c P:System.Environment.HasShutdownStarted property.
45 * \returns whether the runtime has been flagged for shutdown.
48 mono_runtime_is_shutting_down (void)
54 fire_process_exit_event (MonoDomain *domain, gpointer user_data)
57 MonoClassField *field;
59 MonoObject *delegate, *exc;
61 field = mono_class_get_field_from_name (mono_defaults.appdomain_class, "ProcessExit");
64 delegate = *(MonoObject **)(((char *)domain->domain) + field->offset);
70 mono_runtime_delegate_try_invoke (delegate, pa, &exc, &error);
71 mono_error_cleanup (&error);
75 mono_runtime_fire_process_exit_event (void)
77 #ifndef MONO_CROSS_COMPILE
78 mono_domain_foreach (fire_process_exit_event, NULL);
84 * mono_runtime_try_shutdown:
86 * Try to initialize runtime shutdown.
88 * After this call completes the thread pool will stop accepting new jobs and no further threads will be created.
90 * Returns: TRUE if shutdown was initiated by this call or false is other thread beat this one.
93 mono_runtime_try_shutdown (void)
95 if (InterlockedCompareExchange (&shutting_down_inited, TRUE, FALSE))
98 mono_runtime_fire_process_exit_event ();
100 shutting_down = TRUE;
102 mono_threads_set_shutting_down ();
104 /* No new threads will be created after this point */
106 mono_runtime_set_shutting_down ();
108 /*TODO move the follow to here:
109 mono_thread_suspend_all_other_threads (); OR mono_thread_wait_all_other_threads
111 mono_runtime_quit ();
119 mono_runtime_is_critical_method (MonoMethod *method)
125 Coordinate the creation of all remaining TLS slots in the runtime.
126 No further TLS slots should be created after this function finishes.
127 This restriction exists because AOT requires offsets to be constant
131 mono_runtime_init_tls (void)
133 mono_marshal_init_tls ();
137 mono_runtime_get_aotid (void)
140 guint8 aotid_sum = 0;
141 MonoDomain* domain = mono_domain_get ();
143 if (!domain->entry_assembly || !domain->entry_assembly->image)
146 guint8 (*aotid)[16] = &domain->entry_assembly->image->aotid;
148 for (i = 0; i < 16; ++i)
149 aotid_sum |= (*aotid)[i];
154 return mono_guid_to_string ((guint8*) aotid);