From f792b2ce64aeb5ffd9ef8a88d56454e7664a9b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 9 May 2023 14:18:50 +0200 Subject: [PATCH] gobject: Use atomic compare and exchange full to force floating In case first exchange failed we can avoid repeating the pointer get operation given that exchange full can provide us the old value. --- gobject/gobject.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/gobject/gobject.c b/gobject/gobject.c index a61754b9f..62bf6d0ef 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -3436,16 +3436,20 @@ object_floating_flag_handler (GObject *object, { gpointer oldvalue; case +1: /* force floating if possible */ - do - oldvalue = g_atomic_pointer_get (&object->qdata); - while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue, - (gpointer) ((gsize) oldvalue | OBJECT_FLOATING_FLAG))); + oldvalue = g_atomic_pointer_get (&object->qdata); + while (!g_atomic_pointer_compare_and_exchange_full ( + (void**) &object->qdata, oldvalue, + (void *) ((gsize) oldvalue | OBJECT_FLOATING_FLAG), + &oldvalue)) + ; return (gsize) oldvalue & OBJECT_FLOATING_FLAG; case -1: /* sink if possible */ - do - oldvalue = g_atomic_pointer_get (&object->qdata); - while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue, - (gpointer) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG))); + oldvalue = g_atomic_pointer_get (&object->qdata); + while (!g_atomic_pointer_compare_and_exchange_full ( + (void**) &object->qdata, oldvalue, + (void *) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG), + &oldvalue)) + ; return (gsize) oldvalue & OBJECT_FLOATING_FLAG; default: /* check floating */ return 0 != ((gsize) g_atomic_pointer_get (&object->qdata) & OBJECT_FLOATING_FLAG);