X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fappdomain.c;h=dfab9b8a7dcc3bb64ffdf4c448065b1128cfe66b;hb=5dd2290ef2738ee2e708953dcb83c1822358d184;hp=58304b574be437794de04b4d31dce862f031306d;hpb=399f6e2425d5fdf73c4f956e9e906613b55968d0;p=mono.git diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index 58304b574be..dfab9b8a7dc 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -1,5 +1,6 @@ -/* - * appdomain.c: AppDomain functions +/** + * \file + * AppDomain functions * * Authors: * Dietmar Maurer (dietmar@ximian.com) @@ -38,7 +39,6 @@ #include #include #include "mono/metadata/metadata-internals.h" -#include #include #include #include @@ -76,19 +76,6 @@ #include #endif -/* - * This is the version number of the corlib-runtime interface. When - * making changes to this interface (by changing the layout - * of classes the runtime knows about, changing icall signature or - * semantics etc), increment this variable. Also increment the - * pair of this variable in mscorlib in: - * mcs/class/corlib/System/Environment.cs - * - * Changes which are already detected at runtime, like the addition - * of icalls, do not require an increment. - */ -#define MONO_CORLIB_VERSION 164 - typedef struct { int runtime_count; @@ -124,6 +111,9 @@ static MonoDomain * mono_domain_create_appdomain_checked (char *friendly_name, char *configuration_file, MonoError *error); +static void +mono_context_set_default_context (MonoDomain *domain); + static char * get_shadow_assembly_location_base (MonoDomain *domain, MonoError *error); @@ -243,14 +233,14 @@ create_domain_objects (MonoDomain *domain) /** * mono_runtime_init: - * @domain: domain returned by mono_init () + * \param domain domain returned by \c mono_init * * Initialize the core AppDomain: this function will run also some * IL initialization code, so it needs the execution engine to be fully * operational. * - * AppDomain.SetupInformation is set up in mono_runtime_exec_main, where - * we know the entry_assembly. + * \c AppDomain.SetupInformation is set up in \c mono_runtime_exec_main, where + * we know the \c entry_assembly. * */ void @@ -312,7 +302,7 @@ mono_runtime_init_checked (MonoDomain *domain, MonoThreadStartCB start_cb, MonoT /* contexts use GC handles, so they must be initialized after the GC */ mono_context_init_checked (domain, error); return_if_nok (error); - mono_context_set (domain->default_context); + mono_context_set_default_context (domain); #ifndef DISABLE_SOCKETS mono_network_init (); @@ -329,6 +319,15 @@ mono_runtime_init_checked (MonoDomain *domain, MonoThreadStartCB start_cb, MonoT return; } +static void +mono_context_set_default_context (MonoDomain *domain) +{ + HANDLE_FUNCTION_ENTER (); + mono_context_set_handle (MONO_HANDLE_NEW (MonoAppContext, domain->default_context)); + HANDLE_FUNCTION_RETURN (); +} + + static int mono_get_corlib_version (void) { @@ -350,11 +349,9 @@ mono_get_corlib_version (void) } /** - * mono_check_corlib_version - * + * mono_check_corlib_version: * Checks that the corlib that is loaded matches the version of this runtime. - * - * Returns: NULL if the runtime will work with the corlib, or a g_malloc + * \returns NULL if the runtime will work with the corlib, or a \c g_malloc * allocated string with the error otherwise. */ const char* @@ -375,9 +372,8 @@ mono_check_corlib_version (void) /** * mono_context_init: - * @domain: The domain where the System.Runtime.Remoting.Context.Context is initialized - * - * Initializes the @domain's default System.Runtime.Remoting's Context. + * \param domain The domain where the \c System.Runtime.Remoting.Context.Context is initialized + * Initializes the \p domain's default \c System.Runtime.Remoting 's Context. */ void mono_context_init (MonoDomain *domain) @@ -401,13 +397,14 @@ mono_context_init_checked (MonoDomain *domain, MonoError *error) context->domain_id = domain->domain_id; context->context_id = 0; - ves_icall_System_Runtime_Remoting_Contexts_Context_RegisterContext (context); + mono_threads_register_app_context (context, error); + mono_error_assert_ok (error); domain->default_context = context; } /** * mono_runtime_cleanup: - * @domain: unused. + * \param domain unused. * * Internal routine. * @@ -436,12 +433,18 @@ mono_runtime_cleanup (MonoDomain *domain) static MonoDomainFunc quit_function = NULL; +/** + * mono_install_runtime_cleanup: + */ void mono_install_runtime_cleanup (MonoDomainFunc func) { quit_function = func; } +/** + * mono_runtime_quit: + */ void mono_runtime_quit () { @@ -451,10 +454,9 @@ mono_runtime_quit () /** * mono_domain_create_appdomain: - * @friendly_name: The friendly name of the appdomain to create - * @configuration_file: The configuration file to initialize the appdomain with - * - * Returns a MonoDomain initialized with the appdomain + * \param friendly_name The friendly name of the appdomain to create + * \param configuration_file The configuration file to initialize the appdomain with + * \returns a \c MonoDomain initialized with the appdomain */ MonoDomain * mono_domain_create_appdomain (char *friendly_name, char *configuration_file) @@ -468,11 +470,11 @@ mono_domain_create_appdomain (char *friendly_name, char *configuration_file) /** * mono_domain_create_appdomain_checked: - * @friendly_name: The friendly name of the appdomain to create - * @configuration_file: The configuration file to initialize the appdomain with - * @error: Set on error. + * \param friendly_name The friendly name of the appdomain to create + * \param configuration_file The configuration file to initialize the appdomain with + * \param error Set on error. * - * Returns a MonoDomain initialized with the appdomain. On failure sets @error and returns NULL. + * \returns a MonoDomain initialized with the appdomain. On failure sets \p error and returns NULL. */ MonoDomain * mono_domain_create_appdomain_checked (char *friendly_name, char *configuration_file, MonoError *error) @@ -506,9 +508,9 @@ leave: /** * mono_domain_set_config: - * @domain: MonoDomain initialized with the appdomain we want to change - * @base_dir: new base directory for the appdomain - * @config_file_name: path to the new configuration for the app domain + * \param domain \c MonoDomain initialized with the appdomain we want to change + * \param base_dir new base directory for the appdomain + * \param config_file_name path to the new configuration for the app domain * * Used to set the system configuration for an appdomain * @@ -663,10 +665,9 @@ leave: /** * mono_domain_has_type_resolve: - * @domain: application domains being looked up + * \param domain application domain being looked up * - * Returns: TRUE if the AppDomain.TypeResolve field has been - * set. + * \returns TRUE if the \c AppDomain.TypeResolve field has been set. */ gboolean mono_domain_has_type_resolve (MonoDomain *domain) @@ -689,16 +690,16 @@ mono_domain_has_type_resolve (MonoDomain *domain) /** * mono_domain_try_type_resolve: - * @domain: application domainwhere the name where the type is going to be resolved - * @name: the name of the type to resolve or NULL. - * @tb: A System.Reflection.Emit.TypeBuilder, used if name is NULL. + * \param domain application domainwhere the name where the type is going to be resolved + * \param name the name of the type to resolve or NULL. + * \param tb A \c System.Reflection.Emit.TypeBuilder, used if name is NULL. * - * This routine invokes the internal System.AppDomain.DoTypeResolve and returns + * This routine invokes the internal \c System.AppDomain.DoTypeResolve and returns * the assembly that matches name. * - * If @name is null, the value of ((TypeBuilder)tb).FullName is used instead + * If \p name is null, the value of \c ((TypeBuilder)tb).FullName is used instead * - * Returns: A MonoReflectionAssembly or NULL if not found + * \returns A \c MonoReflectionAssembly or NULL if not found */ MonoReflectionAssembly * mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb) @@ -742,8 +743,7 @@ mono_domain_try_type_resolve_checked (MonoDomain *domain, char *name, MonoObject /** * mono_domain_owns_vtable_slot: - * - * Returns whenever VTABLE_SLOT is inside a vtable which belongs to DOMAIN. + * \returns Whether \p vtable_slot is inside a vtable which belongs to \p domain. */ gboolean mono_domain_owns_vtable_slot (MonoDomain *domain, gpointer vtable_slot) @@ -758,15 +758,13 @@ mono_domain_owns_vtable_slot (MonoDomain *domain, gpointer vtable_slot) /** * mono_domain_set: - * @domain: domain - * @force: force setting. + * \param domain domain + * \param force force setting. * - * Set the current appdomain to @domain. If @force is set, set it even + * Set the current appdomain to \p domain. If \p force is set, set it even * if it is being unloaded. * - * Returns: - * TRUE on success; - * FALSE if the domain is unloaded + * \returns TRUE on success; FALSE if the domain is unloaded */ gboolean mono_domain_set (MonoDomain *domain, gboolean force) @@ -1842,8 +1840,10 @@ mono_make_shadow_copy (const char *filename, MonoError *oerror) sibling_source_len = strlen (sibling_source); sibling_target = g_strconcat (shadow, ".config", NULL); sibling_target_len = strlen (sibling_target); - + copy_result = shadow_copy_sibling (sibling_source, sibling_source_len, ".mdb", sibling_target, sibling_target_len, 7); + if (copy_result) + copy_result = shadow_copy_sibling (sibling_source, sibling_source_len, ".pdb", sibling_target, sibling_target_len, 11); if (copy_result) copy_result = shadow_copy_sibling (sibling_source, sibling_source_len, ".config", sibling_target, sibling_target_len, 7); @@ -1871,6 +1871,9 @@ mono_make_shadow_copy (const char *filename, MonoError *oerror) } #endif /* DISABLE_SHADOW_COPY */ +/** + * mono_domain_from_appdomain: + */ MonoDomain * mono_domain_from_appdomain (MonoAppDomain *appdomain_raw) { @@ -1902,9 +1905,11 @@ leave: static gboolean -try_load_from (MonoAssembly **assembly, const gchar *path1, const gchar *path2, - const gchar *path3, const gchar *path4, - gboolean refonly, gboolean is_private) +try_load_from (MonoAssembly **assembly, + const gchar *path1, const gchar *path2, + const gchar *path3, const gchar *path4, + gboolean refonly, gboolean is_private, + MonoAssemblyCandidatePredicate predicate, gpointer user_data) { gchar *fullpath; gboolean found = FALSE; @@ -1923,14 +1928,14 @@ try_load_from (MonoAssembly **assembly, const gchar *path1, const gchar *path2, found = g_file_test (fullpath, G_FILE_TEST_IS_REGULAR); if (found) - *assembly = mono_assembly_open_full (fullpath, NULL, refonly); + *assembly = mono_assembly_open_predicate (fullpath, refonly, FALSE, predicate, user_data, NULL); g_free (fullpath); return (*assembly != NULL); } static MonoAssembly * -real_load (gchar **search_path, const gchar *culture, const gchar *name, gboolean refonly) +real_load (gchar **search_path, const gchar *culture, const gchar *name, gboolean refonly, MonoAssemblyCandidatePredicate predicate, gpointer user_data) { MonoAssembly *result = NULL; gchar **path; @@ -1957,22 +1962,22 @@ real_load (gchar **search_path, const gchar *culture, const gchar *name, gboolea /* See test cases in bug #58992 and bug #57710 */ /* 1st try: [culture]/[name].dll (culture may be empty) */ strcpy (filename + len - 4, ".dll"); - if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private)) + if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private, predicate, user_data)) break; /* 2nd try: [culture]/[name].exe (culture may be empty) */ strcpy (filename + len - 4, ".exe"); - if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private)) + if (try_load_from (&result, *path, local_culture, "", filename, refonly, is_private, predicate, user_data)) break; /* 3rd try: [culture]/[name]/[name].dll (culture may be empty) */ strcpy (filename + len - 4, ".dll"); - if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private)) + if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private, predicate, user_data)) break; /* 4th try: [culture]/[name]/[name].exe (culture may be empty) */ strcpy (filename + len - 4, ".exe"); - if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private)) + if (try_load_from (&result, *path, local_culture, name, filename, refonly, is_private, predicate, user_data)) break; } @@ -1997,12 +2002,28 @@ mono_domain_assembly_preload (MonoAssemblyName *aname, set_domain_search_path (domain); + MonoAssemblyCandidatePredicate predicate = NULL; + void* predicate_ud = NULL; +#if !defined(DISABLE_STRICT_STRONG_NAMES) + if (G_LIKELY (mono_loader_get_strict_strong_names ())) { + predicate = &mono_assembly_candidate_predicate_sn_same_name; + predicate_ud = aname; + } +#endif if (domain->search_path && domain->search_path [0] != NULL) { - result = real_load (domain->search_path, aname->culture, aname->name, refonly); + if (mono_trace_is_traced (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY)) { + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Domain %s search path is:", domain->friendly_name); + for (int i = 0; domain->search_path [i]; i++) { + const char *p = domain->search_path[i]; + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "\tpath[%d] = '%s'", i, p); + } + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "End of domain %s search path.", domain->friendly_name); + } + result = real_load (domain->search_path, aname->culture, aname->name, refonly, predicate, predicate_ud); } if (result == NULL && assemblies_path && assemblies_path [0] != NULL) { - result = real_load (assemblies_path, aname->culture, aname->name, refonly); + result = real_load (assemblies_path, aname->culture, aname->name, refonly, predicate, predicate_ud); } return result; @@ -2056,7 +2077,7 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoStringHandle fname, MonoBoole if (!is_ok (error)) goto leave; - MonoAssembly *ass = mono_assembly_open_a_lot (filename, &status, refOnly, TRUE); + MonoAssembly *ass = mono_assembly_open_predicate (filename, refOnly, TRUE, NULL, NULL, &status); if (!ass) { if (status == MONO_IMAGE_IMAGE_INVALID) @@ -2236,9 +2257,11 @@ ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id, Mono } void -ves_icall_System_AppDomain_DoUnhandledException (MonoException *exc) +ves_icall_System_AppDomain_DoUnhandledException (MonoExceptionHandle exc, MonoError *error) { - mono_unhandled_exception ((MonoObject*) exc); + error_init (error); + mono_unhandled_exception_checked (MONO_HANDLE_CAST (MonoObject, exc), error); + mono_error_assert_ok (error); } gint32 @@ -2336,24 +2359,27 @@ ves_icall_System_AppDomain_InternalPopDomainRef (MonoError *error) mono_thread_pop_appdomain_ref (); } -MonoAppContext * -ves_icall_System_AppDomain_InternalGetContext () +MonoAppContextHandle +ves_icall_System_AppDomain_InternalGetContext (MonoError *error) { - return mono_context_get (); + error_init (error); + return mono_context_get_handle (); } -MonoAppContext * -ves_icall_System_AppDomain_InternalGetDefaultContext () +MonoAppContextHandle +ves_icall_System_AppDomain_InternalGetDefaultContext (MonoError *error) { - return mono_domain_get ()->default_context; + error_init (error); + return MONO_HANDLE_NEW (MonoAppContext, mono_domain_get ()->default_context); } -MonoAppContext * -ves_icall_System_AppDomain_InternalSetContext (MonoAppContext *mc) +MonoAppContextHandle +ves_icall_System_AppDomain_InternalSetContext (MonoAppContextHandle mc, MonoError *error) { - MonoAppContext *old_context = mono_context_get (); + error_init (error); + MonoAppContextHandle old_context = mono_context_get_handle (); - mono_context_set (mc); + mono_context_set_handle (mc); return old_context; } @@ -2376,6 +2402,9 @@ ves_icall_System_AppDomain_InternalGetProcessGuid (MonoStringHandle newguid, Mon return newguid; } +/** + * mono_domain_is_unloading: + */ gboolean mono_domain_is_unloading (MonoDomain *domain) { @@ -2565,12 +2594,12 @@ failure: return 1; } -/* +/** * mono_domain_unload: - * @domain: The domain to unload + * \param domain The domain to unload * - * Unloads an appdomain. Follows the process outlined in the comment - * for mono_domain_try_unload. + * Unloads an appdomain. Follows the process outlined in the comment + * for \c mono_domain_try_unload. */ void mono_domain_unload (MonoDomain *domain) @@ -2591,10 +2620,10 @@ guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertab return result; } -/* +/** * mono_domain_unload: - * @domain: The domain to unload - * @exc: Exception information + * \param domain The domain to unload + * \param exc Exception information * * Unloads an appdomain. Follows the process outlined in: * http://blogs.gotdotnet.com/cbrumme