Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormonojenkins <jo.shields+jenkins@xamarin.com>2020-08-26 17:00:03 +0300
committerGitHub <noreply@github.com>2020-08-26 17:00:03 +0300
commit990f516a4b506588ee5c3223358c8505b83c3f95 (patch)
treec86649eca7b260b23396c1f151aa57e254ed92f0
parentad95c02c2a9bf9b852c571d856f2d7e8e674757c (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.c2
-rw-r--r--mono/metadata/assembly.c12
-rw-r--r--mono/metadata/metadata-internals.h8
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);