Skip to content

Commit

Permalink
[mono] Add mono_assembly_decref, return value on both decref and addr…
Browse files Browse the repository at this point in the history
…ef (#41342)
  • Loading branch information
CoffeeFlux authored Aug 26, 2020
1 parent 436f155 commit c6da68c
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/mono/mono/metadata/assembly-load-context.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 9 additions & 3 deletions src/mono/mono/metadata/assembly.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/*
Expand Down Expand Up @@ -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));
Expand Down
8 changes: 6 additions & 2 deletions src/mono/mono/metadata/metadata-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit c6da68c

Please sign in to comment.