diff options
| author | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
| commit | 80ec1decc49c72efec2a8b87c06245c92c0ab807 (patch) | |
| tree | e3b229aa94e8dcf0590f2317664176e7b8f7607b /shared/nm-glib-aux/nm-ref-string.c | |
| parent | 65f86e8f56267192d42f2b629fc6b0c99fb9cd0c (diff) | |
New upstream version 1.29.90 upstream/1.29.90
Diffstat (limited to 'shared/nm-glib-aux/nm-ref-string.c')
| -rw-r--r-- | shared/nm-glib-aux/nm-ref-string.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/shared/nm-glib-aux/nm-ref-string.c b/shared/nm-glib-aux/nm-ref-string.c index 526185f3..902f1c80 100644 --- a/shared/nm-glib-aux/nm-ref-string.c +++ b/shared/nm-glib-aux/nm-ref-string.c @@ -1,6 +1,6 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include "nm-default.h" +#include "nm-glib-aux/nm-default-glib-i18n-lib.h" #include "nm-ref-string.h" @@ -168,24 +168,25 @@ void _nm_ref_string_unref_non_null(NMRefString *rstr) { RefString *const rstr0 = (RefString *) rstr; + int r; _ASSERT(rstr0); - if (G_LIKELY(!g_atomic_int_dec_and_test(&rstr0->ref_count))) + /* fast-path: first try to decrement the ref-count without bringing it + * to zero. */ + r = rstr0->ref_count; + if (G_LIKELY(r > 1 && g_atomic_int_compare_and_exchange(&rstr0->ref_count, r, r - 1))) return; + /* We apparently are about to return the last reference. Take a lock. */ + G_LOCK(gl_lock); - /* in the fast-path above, we already decremented the ref-count to zero. - * We need recheck that the ref-count is still zero. */ + nm_assert(g_hash_table_lookup(gl_hash, rstr0) == rstr0); - if (g_atomic_int_get(&rstr0->ref_count) == 0) { + if (G_LIKELY(g_atomic_int_dec_and_test(&rstr0->ref_count))) { if (!g_hash_table_remove(gl_hash, rstr0)) nm_assert_not_reached(); - } else { -#if NM_MORE_ASSERTS > 5 - nm_assert(g_hash_table_lookup(gl_hash, rstr0) == rstr0); -#endif } G_UNLOCK(gl_lock); |