shared: also reimplement g_atomic_pointer_set() macro
It's not strictly necessary, because contrary to g_atomic_pointer_get() and g_atomic_pointer_compare_and_exchange(), glib's variant for the setter is mostly fine. Still, reimplement it, because we use typeof() eagerly and can thus add more static checks than glib.
This commit is contained in:
@@ -610,6 +610,25 @@ _g_atomic_pointer_get(void **atomic)
|
|||||||
(typeof(*_atomic)) _g_atomic_pointer_get((void **) _atomic); \
|
(typeof(*_atomic)) _g_atomic_pointer_get((void **) _atomic); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/* Reimplement g_atomic_pointer_set() macro too. Our variant does more type
|
||||||
|
* checks. */
|
||||||
|
static inline void
|
||||||
|
_g_atomic_pointer_set(void **atomic, void *newval)
|
||||||
|
{
|
||||||
|
return g_atomic_pointer_set(atomic, newval);
|
||||||
|
}
|
||||||
|
#undef g_atomic_pointer_set
|
||||||
|
#define g_atomic_pointer_set(atomic, newval) \
|
||||||
|
({ \
|
||||||
|
typeof(*atomic) *const _atomic = (atomic); \
|
||||||
|
typeof(*_atomic) const _newval = (newval); \
|
||||||
|
_nm_unused gconstpointer const _val_type_check = _newval; \
|
||||||
|
\
|
||||||
|
(void) (0 ? (gpointer) * (_atomic) : NULL); \
|
||||||
|
\
|
||||||
|
_g_atomic_pointer_set((void **) _atomic, (void *) _newval); \
|
||||||
|
})
|
||||||
|
|
||||||
/* Glib implements g_atomic_pointer_compare_and_exchange() as a macro.
|
/* Glib implements g_atomic_pointer_compare_and_exchange() as a macro.
|
||||||
* For one, to inline the atomic operation and also to perform some type checks
|
* For one, to inline the atomic operation and also to perform some type checks
|
||||||
* on the arguments.
|
* on the arguments.
|
||||||
|
Reference in New Issue
Block a user