mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-11 11:56:16 +01:00
gatomic: Make fallback g_atomic_pointer_get type-safe
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>
This commit is contained in:
parent
c20dd3edbf
commit
d2b4ba55cb
@ -423,10 +423,24 @@ G_END_DECLS
|
|||||||
#define g_atomic_int_dec_and_test(atomic) \
|
#define g_atomic_int_dec_and_test(atomic) \
|
||||||
(g_atomic_int_dec_and_test ((gint *) (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) \
|
#define g_atomic_pointer_get(atomic) \
|
||||||
(g_atomic_pointer_get (atomic))
|
(g_atomic_pointer_get (atomic))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define g_atomic_pointer_set(atomic, newval) \
|
#define g_atomic_pointer_set(atomic, newval) \
|
||||||
(g_atomic_pointer_set ((atomic), (gpointer) (newval)))
|
(g_atomic_pointer_set ((atomic), (gpointer) (newval)))
|
||||||
|
|
||||||
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
|
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
|
||||||
(g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval)))
|
(g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval)))
|
||||||
#define g_atomic_pointer_add(atomic, val) \
|
#define g_atomic_pointer_add(atomic, val) \
|
||||||
|
Loading…
Reference in New Issue
Block a user