mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-13 07:56:17 +01:00
gatomicarray: Use atomic exchange for data value
We can use pointer exchange now to avoid doing two operations to switch to the new data pointer. Since we're asserting in case of invalid data, we can just do this check at later point, without involving any different behavior. This changes in the unlikely case that G_DISABLE_ASSERT is defined, as in such case we should undo the operation.
This commit is contained in:
parent
e7269a26e4
commit
920f54e795
@ -161,11 +161,18 @@ _g_atomic_array_update (GAtomicArray *array,
|
||||
guint8 *old;
|
||||
|
||||
G_LOCK (array);
|
||||
old = g_atomic_pointer_get (&array->data);
|
||||
old = g_atomic_pointer_exchange (&array->data, new_data);
|
||||
|
||||
#ifdef G_DISABLE_ASSERT
|
||||
if (old && G_ATOMIC_ARRAY_DATA_SIZE (new_data) < G_ATOMIC_ARRAY_DATA_SIZE (old))
|
||||
{
|
||||
g_atomic_pointer_set (&array->data, old);
|
||||
g_return_if_reached ();
|
||||
}
|
||||
#else
|
||||
g_assert (old == NULL || G_ATOMIC_ARRAY_DATA_SIZE (old) <= G_ATOMIC_ARRAY_DATA_SIZE (new_data));
|
||||
#endif
|
||||
|
||||
g_atomic_pointer_set (&array->data, new_data);
|
||||
if (old)
|
||||
freelist_free (old);
|
||||
G_UNLOCK (array);
|
||||
|
Loading…
Reference in New Issue
Block a user