Add g_clear_pointer()

Also reimplement g_clear_object() using g_clear_pointer()

https://bugzilla.gnome.org/show_bug.cgi?id=674634
This commit is contained in:
Xavier Claessens
2012-04-23 17:57:56 +02:00
parent 3f816dc5d1
commit 00285b7517
6 changed files with 61 additions and 25 deletions

View File

@@ -3057,18 +3057,7 @@ g_object_unref (gpointer _object)
void
g_clear_object (volatile GObject **object_ptr)
{
gpointer *ptr = (gpointer) object_ptr;
gpointer old;
/* This is a little frustrating.
* Would be nice to have an atomic exchange (with no compare).
*/
do
old = g_atomic_pointer_get (ptr);
while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (ptr, old, NULL));
if (old)
g_object_unref (old);
g_clear_pointer (object_ptr, g_object_unref);
}
/**