### Function

# GLib atomic_pointer_compare_and_exchange_full

since: 2.74

#### Declaration

    gboolean
    g_atomic_pointer_compare_and_exchange_full (
      void* atomic,
      gpointer oldval,
      gpointer newval,
      void* preval
    )

#### Description

Compares `atomic` to `oldval` and, if equal, sets it to `newval`. If `atomic` was not equal to `oldval` then no change occurs. In any case the value of `atomic` before this operation is stored in `preval`.

This compare and exchange is done atomically.

Think of this operation as an atomic version of `{ *preval = *atomic; if (*atomic == oldval) { *atomic = newval; return TRUE; } else return FALSE; }`.

This call acts as a full compiler and hardware memory barrier.

See also g_atomic_pointer_compare_and_exchange().

Available since: 2.74

#### Parameters

`atomic`

  Type: `void*`

  A pointer to a #gpointer-sized value.

  The data is owned by the caller of the function.

`oldval`

  Type: `gpointer`

  The value to compare with.

  The argument can be `NULL`.
  The data is owned by the caller of the function.

`newval`

  Type: `gpointer`

  The value to conditionally replace with.

  The argument can be `NULL`.
  The data is owned by the caller of the function.

`preval`

  Type: `void*`

  The contents of `atomic` before this operation.

  The argument will be set by the function.

#### Return value

Type: `gboolean`

`TRUE` if the exchange took place.