summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glib/gthread-posix.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
index a09b7a257..bc0da94dd 100644
--- a/glib/gthread-posix.c
+++ b/glib/gthread-posix.c
@@ -47,6 +47,7 @@
#include "gslice.h"
#include "gmessages.h"
#include "gstrfuncs.h"
+#include "gcleanup.h"
#include <stdlib.h>
#include <stdio.h>
@@ -126,7 +127,9 @@ g_mutex_get_impl (GMutex *mutex)
if G_UNLIKELY (impl == NULL)
{
impl = g_mutex_impl_new ();
- if (!g_atomic_pointer_compare_and_exchange (&mutex->p, NULL, impl))
+ if (g_atomic_pointer_compare_and_exchange (&mutex->p, NULL, impl))
+ G_CLEANUP_ADD (impl, g_mutex_impl_free);
+ else
g_mutex_impl_free (impl);
impl = mutex->p;
}
@@ -295,7 +298,9 @@ g_rec_mutex_get_impl (GRecMutex *rec_mutex)
if G_UNLIKELY (impl == NULL)
{
impl = g_rec_mutex_impl_new ();
- if (!g_atomic_pointer_compare_and_exchange (&rec_mutex->p, NULL, impl))
+ if (g_atomic_pointer_compare_and_exchange (&rec_mutex->p, NULL, impl))
+ G_CLEANUP_ADD (impl, g_rec_mutex_impl_free);
+ else
g_rec_mutex_impl_free (impl);
impl = rec_mutex->p;
}
@@ -455,7 +460,9 @@ g_rw_lock_get_impl (GRWLock *lock)
if G_UNLIKELY (impl == NULL)
{
impl = g_rw_lock_impl_new ();
- if (!g_atomic_pointer_compare_and_exchange (&lock->p, NULL, impl))
+ if (g_atomic_pointer_compare_and_exchange (&lock->p, NULL, impl))
+ G_CLEANUP_ADD (impl, g_rw_lock_impl_free);
+ else
g_rw_lock_impl_free (impl);
impl = lock->p;
}
@@ -672,7 +679,9 @@ g_cond_get_impl (GCond *cond)
if G_UNLIKELY (impl == NULL)
{
impl = g_cond_impl_new ();
- if (!g_atomic_pointer_compare_and_exchange (&cond->p, NULL, impl))
+ if (g_atomic_pointer_compare_and_exchange (&cond->p, NULL, impl))
+ G_CLEANUP_ADD (impl, g_cond_impl_free);
+ else
g_cond_impl_free (impl);
impl = cond->p;
}
@@ -990,7 +999,11 @@ g_private_get_impl (GPrivate *key)
if G_UNLIKELY (impl == NULL)
{
impl = g_private_impl_new (key->notify);
- if (!g_atomic_pointer_compare_and_exchange (&key->p, NULL, impl))
+ if (g_atomic_pointer_compare_and_exchange (&key->p, NULL, impl))
+ {
+ G_CLEANUP_ADD (impl, g_private_impl_free);
+ }
+ else
{
g_private_impl_free (impl);
impl = key->p;