* perform the operations normally and then release the lock.
**/
+/* NOTE CAREFULLY:
+ *
+ * This file is the lowest-level part of GLib.
+ *
+ * Other lowlevel parts of GLib (threads, slice allocator, g_malloc,
+ * messages, etc) call into these functions and macros to get work done.
+ *
+ * As such, these functions can not call back into any part of GLib
+ * without risking recursion.
+ */
+
#ifdef G_ATOMIC_OP_USE_GCC_BUILTINS
#ifndef __GNUC__
#else
-#include "gthread.h"
+/* We are not permitted to call into any GLib functions from here, so we
+ * can not use GMutex.
+ *
+ * Fortunately, we already take care of the Windows case above, and all
+ * non-Windows platforms on which glib runs have pthreads. Use those.
+ */
+#include <pthread.h>
-static GStaticMutex g_atomic_lock;
+static pthread_mutex_t g_atomic_lock = PTHREAD_MUTEX_INITIALIZER;
gint
(g_atomic_int_get) (volatile gint *atomic)
{
gint value;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
value = *atomic;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return value;
}
(g_atomic_int_set) (volatile gint *atomic,
gint value)
{
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
*atomic = value;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
}
void
(g_atomic_int_inc) (volatile gint *atomic)
{
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
(*atomic)++;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
}
gboolean
{
gboolean is_zero;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
is_zero = --(*atomic) == 0;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return is_zero;
}
{
gboolean success;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
if ((success = (*atomic == oldval)))
*atomic = newval;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return success;
}
{
gint oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *atomic;
*atomic = oldval + val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
{
guint oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *atomic;
*atomic = oldval & val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
{
guint oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *atomic;
*atomic = oldval | val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
{
guint oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *atomic;
*atomic = oldval ^ val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
volatile gpointer *ptr = atomic;
gpointer value;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
value = *ptr;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return value;
}
{
volatile gpointer *ptr = atomic;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
*ptr = newval;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
}
gboolean
volatile gpointer *ptr = atomic;
gboolean success;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
if ((success = (*ptr == oldval)))
*ptr = newval;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return success;
}
volatile gssize *ptr = atomic;
gssize oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *ptr;
*ptr = oldval + val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
volatile gsize *ptr = atomic;
gsize oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *ptr;
*ptr = oldval & val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
volatile gsize *ptr = atomic;
gsize oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *ptr;
*ptr = oldval | val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}
volatile gsize *ptr = atomic;
gsize oldval;
- g_static_mutex_lock (&g_atomic_lock);
+ pthread_mutex_lock (&g_atomic_lock);
oldval = *ptr;
*ptr = oldval ^ val;
- g_static_mutex_unlock (&g_atomic_lock);
+ pthread_mutex_unlock (&g_atomic_lock);
return oldval;
}