diff options
author | monojenkins <jo.shields+jenkins@xamarin.com> | 2020-08-26 17:00:03 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-26 17:00:03 +0300 |
commit | 990f516a4b506588ee5c3223358c8505b83c3f95 (patch) | |
tree | c86649eca7b260b23396c1f151aa57e254ed92f0 | |
parent | ad95c02c2a9bf9b852c571d856f2d7e8e674757c (diff) |
[mono] Add mono_assembly_decref, return value on both decref and addref (#20305)
Needed for unloadability
Co-authored-by: CoffeeFlux <CoffeeFlux@users.noreply.github.com>
-rw-r--r-- | mono/metadata/assembly-load-context.c | 2 | ||||
-rw-r--r-- | mono/metadata/assembly.c | 12 | ||||
-rw-r--r-- | mono/metadata/metadata-internals.h | 8 |
3 files changed, 16 insertions, 6 deletions
diff --git a/mono/metadata/assembly-load-context.c b/mono/metadata/assembly-load-context.c index e9334611d08..105609dffd0 100644 --- a/mono/metadata/assembly-load-context.c +++ b/mono/metadata/assembly-load-context.c @@ -53,7 +53,7 @@ mono_alc_cleanup (MonoAssemblyLoadContext *alc) for (tmp = alc->loaded_assemblies; tmp; tmp = tmp->next) { MonoAssembly *assembly = (MonoAssembly *)tmp->data; g_slist_remove (domain->domain_assemblies, assembly); - mono_atomic_dec_i32 (&assembly->ref_count); + mono_assembly_decref (assembly); mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Unloading ALC [%p], removing assembly %s[%p] from domain_assemblies, ref_count=%d\n", alc, assembly->aname.name, assembly, assembly->ref_count); } mono_domain_assemblies_unlock (domain); diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index dcbfbf7d8d6..d24ff566e78 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -1308,10 +1308,16 @@ assemblyref_public_tok_checked (MonoImage *image, guint32 key_index, guint32 fla * The reference count is reduced every time the method mono_assembly_close() is * invoked. */ -void +gint32 mono_assembly_addref (MonoAssembly *assembly) { - mono_atomic_inc_i32 (&assembly->ref_count); + return mono_atomic_inc_i32 (&assembly->ref_count); +} + +gint32 +mono_assembly_decref (MonoAssembly *assembly) +{ + return mono_atomic_dec_i32 (&assembly->ref_count); } /* @@ -5057,7 +5063,7 @@ mono_assembly_close_except_image_pools (MonoAssembly *assembly) return FALSE; /* Might be 0 already */ - if (mono_atomic_dec_i32 (&assembly->ref_count) > 0) + if (mono_assembly_decref (assembly) > 0) return FALSE; MONO_PROFILER_RAISE (assembly_unloading, (assembly)); diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index c37d40fd951..4767debd660 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -216,7 +216,7 @@ struct _MonoAssembly { * the additional reference, they can be freed at any time. * The ref_count is initially 0. */ - int ref_count; /* use atomic operations only */ + gint32 ref_count; /* use atomic operations only */ char *basedir; MonoAssemblyName aname; MonoImage *image; @@ -1011,10 +1011,14 @@ gboolean mono_metadata_generic_param_equal (MonoGenericParam *p1, MonoGenericParam *p2); void mono_dynamic_stream_reset (MonoDynamicStream* stream); -MONO_API void mono_assembly_addref (MonoAssembly *assembly); void mono_assembly_load_friends (MonoAssembly* ass); gboolean mono_assembly_has_skip_verification (MonoAssembly* ass); +MONO_API gint32 +mono_assembly_addref (MonoAssembly *assembly); +gint32 +mono_assembly_decref (MonoAssembly *assembly); + void mono_assembly_release_gc_roots (MonoAssembly *assembly); gboolean mono_assembly_close_except_image_pools (MonoAssembly *assembly); void mono_assembly_close_finish (MonoAssembly *assembly); |