*
* Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
* Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ * Copyright 2011-2012 Xamarin, Inc (http://www.xamarin.com)
*/
#include <config.h>
#define SET_APPDOMAIN(x) do { \
MONO_FAST_TLS_SET (tls_appdomain,x); \
mono_native_tls_set_value (appdomain_thread_id, x); \
+ mono_gc_set_current_thread_appdomain (x); \
} while (FALSE)
#else /* !MONO_HAVE_FAST_TLS */
#define GET_APPDOMAIN() ((MonoDomain *)mono_native_tls_get_value (appdomain_thread_id))
-#define SET_APPDOMAIN(x) mono_native_tls_set_value (appdomain_thread_id, x);
+#define SET_APPDOMAIN(x) do { \
+ mono_native_tls_set_value (appdomain_thread_id, x); \
+ mono_gc_set_current_thread_appdomain (x); \
+ } while (FALSE)
#endif
static const MonoRuntimeInfo supported_runtimes[] = {
{"v2.0.50215","2.0", { {2,0,0,0}, {8,0,0,0}, { 3, 5, 0, 0 } } },
{"v2.0.50727","2.0", { {2,0,0,0}, {8,0,0,0}, { 3, 5, 0, 0 } } },
- {"v4.0.20506","4.0", { {4,0,0,0}, {10,0,0,0}, { 4, 0, 0, 0 } } },
+ {"v4.0.30319","4.5", { {4,0,0,0}, {10,0,0,0}, { 4, 0, 0, 0 } } },
{"v4.0.30128","4.0", { {4,0,0,0}, {10,0,0,0}, { 4, 0, 0, 0 } } },
- {"v4.0.30319","4.0", { {4,0,0,0}, {10,0,0,0}, { 4, 0, 0, 0 } } },
+ {"v4.0.20506","4.0", { {4,0,0,0}, {10,0,0,0}, { 4, 0, 0, 0 } } },
{"moonlight", "2.1", { {2,0,5,0}, {9,0,0,0}, { 3, 5, 0, 0 } } },
};
return NULL;
}
}
+
+MonoArchEHJitInfo*
+mono_jit_info_get_arch_eh_info (MonoJitInfo *ji)
+{
+ if (ji->has_arch_eh_info) {
+ char *ptr = (char*)&ji->clauses [ji->num_clauses];
+ if (ji->has_generic_jit_info)
+ ptr += sizeof (MonoGenericJitInfo);
+ if (ji->has_try_block_holes)
+ ptr += sizeof (MonoTryBlockHoleTableJitInfo);
+ return (MonoArchEHJitInfo*)ptr;
+ } else {
+ return NULL;
+ }
+}
+
+MonoMethodCasInfo*
+mono_jit_info_get_cas_info (MonoJitInfo *ji)
+{
+ if (ji->has_cas_info) {
+ char *ptr = (char*)&ji->clauses [ji->num_clauses];
+ if (ji->has_generic_jit_info)
+ ptr += sizeof (MonoGenericJitInfo);
+ if (ji->has_try_block_holes)
+ ptr += sizeof (MonoTryBlockHoleTableJitInfo);
+ if (ji->has_arch_eh_info)
+ ptr += sizeof (MonoArchEHJitInfo);
+ return (MonoMethodCasInfo*)ptr;
+ } else {
+ return NULL;
+ }
+}
+
void
mono_install_create_domain_hook (MonoCreateDomainFunc func)
{
SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
#endif
+#ifndef HOST_WIN32
+ wapi_init ();
+#endif
+
mono_perfcounters_init ();
mono_counters_register ("Max native code in a domain", MONO_COUNTER_INT|MONO_COUNTER_JIT, &max_domain_code_size);
mono_gc_base_init ();
MONO_FAST_TLS_INIT (tls_appdomain);
- mono_native_tls_alloc (appdomain_thread_id, NULL);
+ mono_native_tls_alloc (&appdomain_thread_id, NULL);
InitializeCriticalSection (&appdomains_mutex);
DeleteCriticalSection (&appdomains_mutex);
#ifndef HOST_WIN32
- _wapi_cleanup ();
+ wapi_cleanup ();
#endif
}
unregister_vtable_reflection_type (g_ptr_array_index (domain->class_vtable_array, i));
}
+ for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) {
+ MonoAssembly *ass = tmp->data;
+ mono_assembly_release_gc_roots (ass);
+ }
+
/* This needs to be done before closing assemblies */
mono_gc_clear_domain (domain);
for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) {
MonoAssembly *ass = tmp->data;
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading domain %s[%p], assembly %s[%p], ref_count=%d\n", domain->friendly_name, domain, ass->aname.name, ass, ass->ref_count);
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading domain %s[%p], assembly %s[%p], ref_count=%d", domain->friendly_name, domain, ass->aname.name, ass, ass->ref_count);
if (!mono_assembly_close_except_image_pools (ass))
tmp->data = NULL;
}
mono_perfcounters->loader_appdomains--;
- if ((domain == mono_root_domain))
+ if (domain == mono_root_domain)
mono_root_domain = NULL;
}
{
int n;
int max = G_N_ELEMENTS (supported_runtimes);
- gboolean do_partial_match;
int vlen;
if (!version)
return NULL;
- vlen = strlen (version);
- if (vlen >= 4 && version [1] - '0' >= 4)
- do_partial_match = TRUE;
- else
- do_partial_match = FALSE;
-
for (n=0; n<max; n++) {
- if (do_partial_match && strncmp (version, supported_runtimes[n].runtime_version, 4) == 0)
- return &supported_runtimes[n];
if (strcmp (version, supported_runtimes[n].runtime_version) == 0)
return &supported_runtimes[n];
}
+
+ vlen = strlen (version);
+ if (vlen >= 4 && version [1] - '0' >= 4) {
+ for (n=0; n<max; n++) {
+ if (strncmp (version, supported_runtimes[n].runtime_version, 4) == 0)
+ return &supported_runtimes[n];
+ }
+ }
+
return NULL;
}