Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mono] More domain cleanup #50771

Merged
merged 5 commits into from
Apr 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions src/mono/mono/metadata/appdomain.c
Original file line number Diff line number Diff line change
Expand Up @@ -507,16 +507,6 @@ mono_domain_try_type_resolve_name (MonoAssembly *assembly, MonoStringHandle name
HANDLE_FUNCTION_RETURN_REF (MonoReflectionAssembly, MONO_HANDLE_CAST (MonoReflectionAssembly, ret));
}

/**
* mono_domain_owns_vtable_slot:
* \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)
{
return mono_mem_manager_mp_contains_addr (mono_mem_manager_get_ambient (), vtable_slot);
}

MonoAssembly*
mono_try_assembly_resolve (MonoAssemblyLoadContext *alc, const char *fname_raw, MonoAssembly *requesting, MonoError *error)
{
Expand Down
4 changes: 2 additions & 2 deletions src/mono/mono/metadata/appdomain.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ mono_domain_has_type_resolve (MonoDomain *domain);
MONO_API MONO_RT_EXTERNAL_ONLY MonoReflectionAssembly *
mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb);

MONO_API mono_bool
MONO_API MONO_RT_EXTERNAL_ONLY mono_bool
mono_domain_owns_vtable_slot (MonoDomain *domain, void* vtable_slot);

MONO_API MONO_RT_EXTERNAL_ONLY void
Expand All @@ -139,7 +139,7 @@ mono_context_get_id (MonoAppContext *context);
MONO_API MONO_RT_EXTERNAL_ONLY int32_t
mono_context_get_domain_id (MonoAppContext *context);

MONO_API MonoJitInfo *
MONO_API MONO_RT_EXTERNAL_ONLY MonoJitInfo *
mono_jit_info_table_find (MonoDomain *domain, void* addr);

/* MonoJitInfo accessors */
Expand Down
78 changes: 0 additions & 78 deletions src/mono/mono/metadata/boehm-gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1577,47 +1577,6 @@ mono_gc_is_null (void)
return FALSE;
}

/**
* mono_gchandle_is_in_domain:
* \param gchandle a GCHandle's handle.
* \param domain An application domain.
*
* Use this function to determine if the \p gchandle points to an
* object allocated in the specified \p domain.
*
* \returns TRUE if the object wrapped by the \p gchandle belongs to the specific \p domain.
*/
gboolean
mono_gchandle_is_in_domain (MonoGCHandle gch, MonoDomain *domain)
{
guint32 gchandle = MONO_GC_HANDLE_TO_UINT (gch);
guint slot = MONO_GC_HANDLE_SLOT (gchandle);
guint type = MONO_GC_HANDLE_TYPE (gchandle);
HandleData *handles = &gc_handles [type];
gboolean result = FALSE;

if (type >= HANDLE_TYPE_MAX)
return FALSE;

lock_handles (handles);
if (slot < handles->size && slot_occupied (handles, slot)) {
if (MONO_GC_HANDLE_TYPE_IS_WEAK (handles->type)) {
result = domain->domain_id == handles->domain_ids [slot];
} else {
MonoObject *obj;
obj = (MonoObject *)handles->entries [slot];
if (obj == NULL)
result = TRUE;
else
result = domain == mono_object_domain (obj);
}
} else {
/* print a warning? */
}
unlock_handles (handles);
return result;
}

/**
* mono_gchandle_free_internal:
* \param gchandle a GCHandle's handle.
Expand Down Expand Up @@ -1659,43 +1618,6 @@ mono_gchandle_free_internal (MonoGCHandle gch)
MONO_PROFILER_RAISE (gc_handle_deleted, (gchandle, (MonoGCHandleType)handles->type));
}

/**
* mono_gchandle_free_domain:
* \param domain domain that is unloading
*
* Function used internally to cleanup any GC handle for objects belonging
* to the specified domain during appdomain unload.
*/
void
mono_gchandle_free_domain (MonoDomain *domain)
{
guint type;

for (type = HANDLE_TYPE_MIN; type < HANDLE_PINNED; ++type) {
guint slot;
HandleData *handles = &gc_handles [type];
lock_handles (handles);
for (slot = 0; slot < handles->size; ++slot) {
if (!slot_occupied (handles, slot))
continue;
if (MONO_GC_HANDLE_TYPE_IS_WEAK (type)) {
if (domain->domain_id == handles->domain_ids [slot]) {
vacate_slot (handles, slot);
if (handles->entries [slot])
mono_gc_weak_link_remove (&handles->entries [slot], handles->type == HANDLE_WEAK_TRACK);
}
} else {
if (handles->entries [slot] && mono_object_domain (handles->entries [slot]) == domain) {
vacate_slot (handles, slot);
handles->entries [slot] = NULL;
}
}
}
unlock_handles (handles);
}

}

guint64
mono_gc_get_total_allocated_bytes (MonoBoolean precise)
{
Expand Down
24 changes: 0 additions & 24 deletions src/mono/mono/metadata/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
mono_thread_info_tls_set (info, TLS_KEY_DOMAIN, (x)); \
} while (FALSE)

static MonoDomain **appdomains_list;
static MonoImage *exe_image;
static MonoDomain *mono_root_domain;

Expand Down Expand Up @@ -107,25 +106,6 @@ get_runtimes_from_exe (const char *exe_file, MonoImage **exe_image);
static const MonoRuntimeInfo*
get_runtime_by_version (const char *version);

//g_malloc on sgen and mono_gc_alloc_fixed on boehm
static void*
gc_alloc_fixed_non_heap_list (size_t size)
{
if (mono_gc_is_moving ())
return g_malloc0 (size);
else
return mono_gc_alloc_fixed (size, MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_DOMAIN, NULL, "Domain List");
}

static void
gc_free_fixed_non_heap_list (void *ptr)
{
if (mono_gc_is_moving ())
g_free (ptr);
else
mono_gc_free_fixed (ptr);
}

static MonoDomain *
create_root_domain (void)
{
Expand All @@ -148,10 +128,6 @@ create_root_domain (void)

MONO_PROFILER_RAISE (domain_loading, (domain));

// FIXME: why is this needed ?
appdomains_list = (MonoDomain **)gc_alloc_fixed_non_heap_list (sizeof (void*));
appdomains_list [0] = domain;

#ifndef DISABLE_PERFCOUNTERS
mono_atomic_inc_i32 (&mono_perfcounters->loader_appdomains);
mono_atomic_inc_i32 (&mono_perfcounters->loader_total_appdomains);
Expand Down
4 changes: 1 addition & 3 deletions src/mono/mono/metadata/exception.c
Original file line number Diff line number Diff line change
Expand Up @@ -1122,7 +1122,6 @@ char *
mono_exception_handle_get_native_backtrace (MonoExceptionHandle exc)
{
#ifdef HAVE_BACKTRACE_SYMBOLS
MonoDomain *domain;
MonoArrayHandle arr = MONO_HANDLE_NEW(MonoArray, NULL);
int i, len;
GString *text;
Expand All @@ -1132,7 +1131,6 @@ mono_exception_handle_get_native_backtrace (MonoExceptionHandle exc)

if (MONO_HANDLE_IS_NULL(arr))
return g_strdup ("");
domain = mono_domain_get ();
len = mono_array_handle_length (arr);
text = g_string_new_len (NULL, len * 20);
MonoGCHandle gchandle;
Expand All @@ -1145,7 +1143,7 @@ mono_exception_handle_get_native_backtrace (MonoExceptionHandle exc)
for (i = 0; i < len; ++i) {
gpointer ip;
MONO_HANDLE_ARRAY_GETVAL (ip, arr, gpointer, i);
MonoJitInfo *ji = mono_jit_info_table_find (domain, ip);
MonoJitInfo *ji = mono_jit_info_table_find_internal (ip, TRUE, FALSE);
if (ji) {
char *msg = mono_debug_print_stack_frame (mono_jit_info_get_method (ji), (char*)ip - (char*)ji->code_start, NULL);
g_string_append_printf (text, "%s\n", msg);
Expand Down
32 changes: 32 additions & 0 deletions src/mono/mono/metadata/external-only.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "external-only.h"
#include "threads.h"
#include "threads-types.h"
#include "jit-info.h"

/**
* mono_gchandle_new:
Expand Down Expand Up @@ -664,3 +665,34 @@ mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *typebu
mono_error_cleanup (error);
HANDLE_FUNCTION_RETURN_OBJ (ret);
}

/**
* mono_jit_info_table_find:
* \param domain Domain that you want to look up
* \param addr Points to an address with JITed code.
*
* Use this function to obtain a \c MonoJitInfo* object that can be used to get
* some statistics. You should provide both the \p domain on which you will be
* performing the probe, and an address. Since application domains can share code
* the same address can be in use by multiple domains at once.
*
* This does not return any results for trampolines.
*
* \returns NULL if the address does not belong to JITed code (it might be native
* code or a trampoline) or a valid pointer to a \c MonoJitInfo* .
*/
MonoJitInfo*
mono_jit_info_table_find (MonoDomain *domain, gpointer addr)
{
return mono_jit_info_table_find_internal (addr, TRUE, FALSE);
}

/**
* mono_domain_owns_vtable_slot:
* \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)
{
return mono_mem_manager_mp_contains_addr (mono_mem_manager_get_ambient (), vtable_slot);
}
4 changes: 0 additions & 4 deletions src/mono/mono/metadata/gc-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,6 @@ mono_gc_alloc_fixed_no_descriptor (size_t size, MonoGCRootSource source, void *k

void mono_gc_free_fixed (void* addr);

/* make sure the gchandle was allocated for an object in domain */
gboolean mono_gchandle_is_in_domain (MonoGCHandle gchandle, MonoDomain *domain);
void mono_gchandle_free_domain (MonoDomain *domain);

typedef void (*FinalizerThreadCallback) (gpointer user_data);

MonoObject*
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/metadata/icall-eventpipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ eventpipe_execute_rundown (
events_data.buffer_size = 1024 * sizeof(uint32_t);
events_data.buffer = g_new (uint8_t, events_data.buffer_size);
events_data.method_events_func = method_events_func;
mono_jit_info_table_foreach_internal (root_domain, eventpipe_fire_method_events_func, &events_data);
mono_jit_info_table_foreach_internal (eventpipe_fire_method_events_func, &events_data);
g_free (events_data.buffer);

// Iterate all assemblies in domain.
Expand Down
27 changes: 3 additions & 24 deletions src/mono/mono/metadata/jit-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ jit_info_table_find (MonoJitInfoTable *table, MonoThreadHazardPointers *hp, gint
* mono_jit_info_get_method () could fail.
*/
MonoJitInfo*
mono_jit_info_table_find_internal (MonoDomain *domain, gpointer addr, gboolean try_aot, gboolean allow_trampolines)
mono_jit_info_table_find_internal (gpointer addr, gboolean try_aot, gboolean allow_trampolines)
{
MonoJitInfoTable *table;
MonoJitInfo *ji, *module_ji;
Expand Down Expand Up @@ -328,7 +328,7 @@ mono_jit_info_table_find_internal (MonoDomain *domain, gpointer addr, gboolean t
table = (MonoJitInfoTable *)mono_get_hazardous_pointer ((gpointer volatile*)&aot_modules, hp, JIT_INFO_TABLE_HAZARD_INDEX);
module_ji = jit_info_table_find (table, hp, (gint8*)addr);
if (module_ji)
ji = jit_info_find_in_aot_func (domain, module_ji->d.image, addr);
ji = jit_info_find_in_aot_func (module_ji->d.image, addr);
if (hp)
mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
}
Expand All @@ -339,29 +339,8 @@ mono_jit_info_table_find_internal (MonoDomain *domain, gpointer addr, gboolean t
return ji;
}

/**
* mono_jit_info_table_find:
* \param domain Domain that you want to look up
* \param addr Points to an address with JITed code.
*
* Use this function to obtain a \c MonoJitInfo* object that can be used to get
* some statistics. You should provide both the \p domain on which you will be
* performing the probe, and an address. Since application domains can share code
* the same address can be in use by multiple domains at once.
*
* This does not return any results for trampolines.
*
* \returns NULL if the address does not belong to JITed code (it might be native
* code or a trampoline) or a valid pointer to a \c MonoJitInfo* .
*/
MonoJitInfo*
mono_jit_info_table_find (MonoDomain *domain, gpointer addr)
{
return mono_jit_info_table_find_internal (domain, addr, TRUE, FALSE);
}

void
mono_jit_info_table_foreach_internal (MonoDomain *domain, MonoJitInfoFunc func, gpointer user_data)
mono_jit_info_table_foreach_internal (MonoJitInfoFunc func, gpointer user_data)
{
MonoJitInfoTable *table;
MonoJitInfo *ji;
Expand Down
6 changes: 3 additions & 3 deletions src/mono/mono/metadata/jit-info.h
Original file line number Diff line number Diff line change
Expand Up @@ -282,15 +282,15 @@ mono_jit_info_get_unwind_info (MonoJitInfo *ji);
* Installs a new function which is used to return a MonoJitInfo for a method inside
* an AOT module.
*/
typedef MonoJitInfo *(*MonoJitInfoFindInAot) (MonoDomain *domain, MonoImage *image, gpointer addr);
typedef MonoJitInfo *(*MonoJitInfoFindInAot) (MonoImage *image, gpointer addr);
void mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func);

MonoJitInfo* mono_jit_info_table_find_internal (MonoDomain *domain, gpointer addr, gboolean try_aot, gboolean allow_trampolines);
MonoJitInfo* mono_jit_info_table_find_internal (gpointer addr, gboolean try_aot, gboolean allow_trampolines);

typedef void (*MonoJitInfoFunc) (MonoJitInfo *ji, gpointer user_data);

void
mono_jit_info_table_foreach_internal (MonoDomain *domain, MonoJitInfoFunc func, gpointer user_data);
mono_jit_info_table_foreach_internal (MonoJitInfoFunc func, gpointer user_data);

void
mono_jit_code_hash_init (MonoInternalHashTable *jit_code_hash);
Expand Down
3 changes: 2 additions & 1 deletion src/mono/mono/metadata/marshal.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "mono/metadata/abi-details.h"
#include "mono/metadata/custom-attrs-internals.h"
#include "mono/metadata/loader-internals.h"
#include "mono/metadata/jit-info.h"
#include "mono/utils/mono-counters.h"
#include "mono/utils/mono-tls.h"
#include "mono/utils/mono-memory-model.h"
Expand Down Expand Up @@ -540,7 +541,7 @@ mono_delegate_free_ftnptr (MonoDelegate *delegate)
void **method_data;
MonoMethod *method;

ji = mono_jit_info_table_find (mono_domain_get (), mono_get_addr_from_ftnptr (ptr));
ji = mono_jit_info_table_find_internal (mono_get_addr_from_ftnptr (ptr), TRUE, FALSE);
/* FIXME we leak wrapper with the interpreter */
if (!ji)
return;
Expand Down
1 change: 0 additions & 1 deletion src/mono/mono/metadata/metadata-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,6 @@ struct _MonoDynamicAssembly {
MonoAssembly assembly;
char *strong_name;
guint32 strong_name_size;
MonoDomain *domain;
};

struct _MonoDynamicImage {
Expand Down
25 changes: 0 additions & 25 deletions src/mono/mono/metadata/sgen-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -2728,19 +2728,6 @@ mono_gchandle_new_weakref_internal (GCObject *obj, gboolean track_resurrection)
return MONO_GC_HANDLE_FROM_UINT (sgen_gchandle_new_weakref (obj, track_resurrection));
}

/**
* mono_gchandle_is_in_domain:
* \param gchandle a GCHandle's handle.
* \param domain An application domain.
* \returns TRUE if the object wrapped by the \p gchandle belongs to the specific \p domain.
*/
gboolean
mono_gchandle_is_in_domain (MonoGCHandle gchandle, MonoDomain *domain)
{
MonoDomain *gchandle_domain = (MonoDomain *)sgen_gchandle_get_metadata (MONO_GC_HANDLE_TO_UINT (gchandle));
return domain->domain_id == gchandle_domain->domain_id;
}

/**
* mono_gchandle_free_internal:
* \param gchandle a GCHandle's handle.
Expand All @@ -2755,18 +2742,6 @@ mono_gchandle_free_internal (MonoGCHandle gchandle)
sgen_gchandle_free (MONO_GC_HANDLE_TO_UINT (gchandle));
}

/**
* mono_gchandle_free_domain:
* \param unloading domain that is unloading
*
* Function used internally to cleanup any GC handle for objects belonging
* to the specified domain during appdomain unload.
*/
void
mono_gchandle_free_domain (MonoDomain *unloading)
{
}

/**
* mono_gchandle_get_target_internal:
* \param gchandle a GCHandle's handle.
Expand Down
Loading