|
|
@@ -0,0 +1,131 @@ |
|
|
|
--- glib-2.22.5/glib/gatomic.c 2021-01-12 00:34:17.000000000 +0000 |
|
|
|
+++ glib-2.22.5.mod/glib/gatomic.c 2021-01-12 00:31:22.000000000 +0000 |
|
|
|
@@ -561,55 +561,33 @@ |
|
|
|
# error "Your system has an unsupported pointer size" |
|
|
|
# endif /* GLIB_SIZEOF_VOID_P */ |
|
|
|
# elif defined (__aarch64__) |
|
|
|
-static volatile int atomic_spin = 0; |
|
|
|
- |
|
|
|
-static int atomic_spin_trylock (void) |
|
|
|
-{ |
|
|
|
- int result; |
|
|
|
- |
|
|
|
- asm volatile ( |
|
|
|
- "swp %0, %1, [%2]\n" |
|
|
|
- : "=&r,&r" (result) |
|
|
|
- : "r,0" (1), "r,r" (&atomic_spin) |
|
|
|
- : "memory"); |
|
|
|
- if (result == 0) |
|
|
|
- return 0; |
|
|
|
- else |
|
|
|
- return -1; |
|
|
|
-} |
|
|
|
- |
|
|
|
-static void atomic_spin_lock (void) |
|
|
|
-{ |
|
|
|
- while (atomic_spin_trylock()) |
|
|
|
- sched_yield(); |
|
|
|
-} |
|
|
|
- |
|
|
|
-static void atomic_spin_unlock (void) |
|
|
|
-{ |
|
|
|
- atomic_spin = 0; |
|
|
|
-} |
|
|
|
+#include <pthread.h> |
|
|
|
+static pthread_mutex_t g_atomic_lock = PTHREAD_MUTEX_INITIALIZER; |
|
|
|
|
|
|
|
gint |
|
|
|
g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, |
|
|
|
gint val) |
|
|
|
{ |
|
|
|
- gint result; |
|
|
|
- |
|
|
|
- atomic_spin_lock(); |
|
|
|
- result = *atomic; |
|
|
|
- *atomic += val; |
|
|
|
- atomic_spin_unlock(); |
|
|
|
+ guint oldval; |
|
|
|
|
|
|
|
- return result; |
|
|
|
+ pthread_mutex_lock (&g_atomic_lock); |
|
|
|
+ oldval = *atomic; |
|
|
|
+ *atomic = oldval & val; |
|
|
|
+ pthread_mutex_unlock (&g_atomic_lock); |
|
|
|
+ |
|
|
|
+ return oldval; |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, |
|
|
|
gint val) |
|
|
|
{ |
|
|
|
- atomic_spin_lock(); |
|
|
|
- *atomic += val; |
|
|
|
- atomic_spin_unlock(); |
|
|
|
+ guint oldval; |
|
|
|
+ |
|
|
|
+ pthread_mutex_lock (&g_atomic_lock); |
|
|
|
+ oldval = *atomic; |
|
|
|
+ *atomic = oldval & val; |
|
|
|
+ pthread_mutex_unlock (&g_atomic_lock); |
|
|
|
} |
|
|
|
|
|
|
|
gboolean |
|
|
|
@@ -617,19 +595,16 @@ |
|
|
|
gint oldval, |
|
|
|
gint newval) |
|
|
|
{ |
|
|
|
- gboolean result; |
|
|
|
+ gboolean success; |
|
|
|
|
|
|
|
- atomic_spin_lock(); |
|
|
|
- if (*atomic == oldval) |
|
|
|
- { |
|
|
|
- result = TRUE; |
|
|
|
- *atomic = newval; |
|
|
|
- } |
|
|
|
- else |
|
|
|
- result = FALSE; |
|
|
|
- atomic_spin_unlock(); |
|
|
|
+ pthread_mutex_lock (&g_atomic_lock); |
|
|
|
|
|
|
|
- return result; |
|
|
|
+ if ((success = (*atomic == oldval))) |
|
|
|
+ *atomic = newval; |
|
|
|
+ |
|
|
|
+ pthread_mutex_unlock (&g_atomic_lock); |
|
|
|
+ |
|
|
|
+ return success; |
|
|
|
} |
|
|
|
|
|
|
|
gboolean |
|
|
|
@@ -637,19 +612,17 @@ |
|
|
|
gpointer oldval, |
|
|
|
gpointer newval) |
|
|
|
{ |
|
|
|
- gboolean result; |
|
|
|
- |
|
|
|
- atomic_spin_lock(); |
|
|
|
- if (*atomic == oldval) |
|
|
|
- { |
|
|
|
- result = TRUE; |
|
|
|
- *atomic = newval; |
|
|
|
- } |
|
|
|
- else |
|
|
|
- result = FALSE; |
|
|
|
- atomic_spin_unlock(); |
|
|
|
+ gpointer *ptr = atomic; |
|
|
|
+ gboolean success; |
|
|
|
|
|
|
|
- return result; |
|
|
|
+ pthread_mutex_lock (&g_atomic_lock); |
|
|
|
+ |
|
|
|
+ if ((success = (*ptr == oldval))) |
|
|
|
+ *ptr = newval; |
|
|
|
+ |
|
|
|
+ pthread_mutex_unlock (&g_atomic_lock); |
|
|
|
+ |
|
|
|
+ return success; |
|
|
|
} |
|
|
|
# elif defined (G_ATOMIC_CRIS) || defined (G_ATOMIC_CRISV32) |
|
|
|
# ifdef G_ATOMIC_CRIS |