X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fdomain.c;h=66bebd13c88c292d8d00fdd5f8c077d7cadb29c0;hb=c0a8ef12af1f473bfc837325581fe738f1b3178c;hp=c2bfb5d1eb032a3b8ec58609e9958c761d486f24;hpb=d2aa0c42335caf52109018038d706e145398325a;p=mono.git diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index c2bfb5d1eb0..66bebd13c88 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -7,6 +7,7 @@ * * 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 @@ -21,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -44,15 +46,7 @@ * or the other (we used to do it because tls slots were GC-tracked, * but we can't depend on this). */ -static guint32 appdomain_thread_id = -1; - -/* - * Avoid calling TlsSetValue () if possible, since in the io-layer, it acquires - * a global lock (!) so it is a contention point. - */ -#if (defined(__i386__) || defined(__x86_64__)) && !defined(HOST_WIN32) -#define NO_TLS_SET_VALUE -#endif +static MonoNativeTlsKey appdomain_thread_id; #ifdef MONO_HAVE_FAST_TLS @@ -60,21 +54,19 @@ MONO_FAST_TLS_DECLARE(tls_appdomain); #define GET_APPDOMAIN() ((MonoDomain*)MONO_FAST_TLS_GET(tls_appdomain)) -#ifdef NO_TLS_SET_VALUE -#define SET_APPDOMAIN(x) do { \ - MONO_FAST_TLS_SET (tls_appdomain,x); \ -} while (FALSE) -#else #define SET_APPDOMAIN(x) do { \ MONO_FAST_TLS_SET (tls_appdomain,x); \ - TlsSetValue (appdomain_thread_id, x); \ + mono_native_tls_set_value (appdomain_thread_id, x); \ + mono_gc_set_current_thread_appdomain (x); \ } while (FALSE) -#endif #else /* !MONO_HAVE_FAST_TLS */ -#define GET_APPDOMAIN() ((MonoDomain *)TlsGetValue (appdomain_thread_id)) -#define SET_APPDOMAIN(x) TlsSetValue (appdomain_thread_id, x); +#define GET_APPDOMAIN() ((MonoDomain *)mono_native_tls_get_value (appdomain_thread_id)) +#define SET_APPDOMAIN(x) do { \ + mono_native_tls_set_value (appdomain_thread_id, x); \ + mono_gc_set_current_thread_appdomain (x); \ + } while (FALSE) #endif @@ -131,9 +123,9 @@ static MonoAotModuleInfoTable *aot_modules = NULL; 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 } } }, }; @@ -157,7 +149,7 @@ get_runtime_by_version (const char *version); static MonoImage* mono_jit_info_find_aot_module (guint8* addr); -guint32 +MonoNativeTlsKey mono_domain_get_tls_key (void) { return appdomain_thread_id; @@ -1003,6 +995,39 @@ mono_jit_info_get_try_block_hole_table_info (MonoJitInfo *ji) 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) { @@ -1245,6 +1270,10 @@ mono_init_internal (const char *filename, const char *exe_filename, const char * 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); @@ -1254,7 +1283,7 @@ mono_init_internal (const char *filename, const char *exe_filename, const char * mono_gc_base_init (); MONO_FAST_TLS_INIT (tls_appdomain); - appdomain_thread_id = TlsAlloc (); + mono_native_tls_alloc (&appdomain_thread_id, NULL); InitializeCriticalSection (&appdomains_mutex); @@ -1719,15 +1748,11 @@ mono_cleanup (void) mono_debug_cleanup (); mono_metadata_cleanup (); - TlsFree (appdomain_thread_id); + mono_native_tls_free (appdomain_thread_id); DeleteCriticalSection (&appdomains_mutex); - /* - * This should be called last as TlsGetValue ()/TlsSetValue () can be called during - * shutdown. - */ #ifndef HOST_WIN32 - _wapi_cleanup (); + wapi_cleanup (); #endif } @@ -1946,12 +1971,17 @@ mono_domain_free (MonoDomain *domain, gboolean force) 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; } @@ -2066,7 +2096,7 @@ mono_domain_free (MonoDomain *domain, gboolean force) mono_perfcounters->loader_appdomains--; - if ((domain == mono_root_domain)) + if (domain == mono_root_domain) mono_root_domain = NULL; } @@ -2276,7 +2306,7 @@ mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointe if (next >= size) { /* 'data' is allocated by alloc_fixed */ gpointer *new_array = mono_gc_alloc_fixed (sizeof (gpointer) * (size * 2), MONO_GC_ROOT_DESCR_FOR_FIXED (size * 2)); - memcpy (new_array, domain->static_data_array, sizeof (gpointer) * size); + mono_gc_memmove (new_array, domain->static_data_array, sizeof (gpointer) * size); size *= 2; new_array [1] = GINT_TO_POINTER (size); mono_gc_free_fixed (domain->static_data_array); @@ -2548,24 +2578,24 @@ get_runtime_by_version (const char *version) { 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= 4 && version [1] - '0' >= 4) { + for (n=0; n