diff options
author | Simon McVittie <smcv@collabora.com> | 2021-02-14 23:26:58 +0000 |
---|---|---|
committer | Simon McVittie <smcv@collabora.com> | 2021-02-14 23:38:35 +0000 |
commit | d2b4ba55cb24c0bb5b408329497fac6721f751b2 (patch) | |
tree | 90cf51534293fbcf5840bdd16adc2cd5b6c1f343 | |
parent | c20dd3edbfdf7bd07cc583ec36bda141fca1eab2 (diff) | |
download | glib-wip/smcv/armel-atomic-pointer-get.tar.gz |
gatomic: Make fallback g_atomic_pointer_get type-safewip/smcv/armel-atomic-pointer-get
Since !1715, g_atomic_pointer_get (&x) has usually returned the type of
x, rather than a generic pointer, in C++ code (where x is any pointer,
or any pointer-sized integer such as guintptr). glib/tests/cxx.cpp
asserts that this is the case.
However, this was only implemented for the lock-free fast-path, not
for the slow path used in platforms with an ARMv5 baseline (and
therefore no atomic instructions) such as Debian armel.
Signed-off-by: Simon McVittie <smcv@collabora.com>
-rw-r--r-- | glib/gatomic.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/glib/gatomic.h b/glib/gatomic.h index 3b84a5049..16e0c7298 100644 --- a/glib/gatomic.h +++ b/glib/gatomic.h @@ -423,10 +423,24 @@ G_END_DECLS #define g_atomic_int_dec_and_test(atomic) \ (g_atomic_int_dec_and_test ((gint *) (atomic))) +#if defined(glib_typeof) + /* The (void *) cast in the middle *looks* redundant, because + * g_atomic_pointer_get returns void * already, but it's to silence + * -Werror=bad-function-cast when we're doing something like: + * guintptr a, b; ...; a = g_atomic_pointer_get (&b); + * which would otherwise be assigning the void * result of + * g_atomic_pointer_get directly to the pointer-sized but + * non-pointer-typed result. */ +#define g_atomic_pointer_get(atomic) \ + (glib_typeof (*(atomic))) (void *) ((g_atomic_pointer_get) ((void *) atomic)) +#else /* !defined(glib_typeof) */ #define g_atomic_pointer_get(atomic) \ (g_atomic_pointer_get (atomic)) +#endif + #define g_atomic_pointer_set(atomic, newval) \ (g_atomic_pointer_set ((atomic), (gpointer) (newval))) + #define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \ (g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval))) #define g_atomic_pointer_add(atomic, val) \ |