(root)/
glib-2.79.0/
gobject/
gatomicarray.h
       1  /* GObject - GLib Type, Object, Parameter and Signal Library
       2   * Copyright (C) 2009 Benjamin Otte <otte@gnome.org>
       3   *
       4   * SPDX-License-Identifier: LGPL-2.1-or-later
       5   *
       6   * This library is free software; you can redistribute it and/or
       7   * modify it under the terms of the GNU Lesser General Public
       8   * License as published by the Free Software Foundation; either
       9   * version 2.1 of the License, or (at your option) any later version.
      10   *
      11   * This library is distributed in the hope that it will be useful,
      12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14   * Lesser General Public License for more details.
      15   *
      16   * You should have received a copy of the GNU Lesser General
      17   * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
      18   */
      19  #ifndef __G_ATOMIC_ARRAY_H__
      20  #define __G_ATOMIC_ARRAY_H__
      21  
      22  #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
      23  #error "Only <glib-object.h> can be included directly."
      24  #endif
      25  
      26  #include <glib/glib.h>
      27  
      28  G_BEGIN_DECLS
      29  
      30  typedef union _GAtomicArrayMetadata
      31  {
      32    gsize size;
      33    /* We have to ensure that the memory location is sufficiently aligned to
      34     * store any object. With C11 this would be max_align_t, but in practise
      35     * gpointer is sufficient for all known architectures. We could change
      36     * this to `_Alignas(max_align_t) char pad` once we depend on C11. */
      37    gpointer _alignment_padding;
      38  } GAtomicArrayMetadata;
      39  #define G_ATOMIC_ARRAY_DATA_SIZE(mem) (((GAtomicArrayMetadata *) (mem) - 1)->size)
      40  
      41  typedef struct _GAtomicArray GAtomicArray;
      42  struct _GAtomicArray {
      43    gpointer data;  /* elements - atomic */
      44  };
      45  
      46  void     _g_atomic_array_init   (GAtomicArray *array);
      47  gpointer _g_atomic_array_copy   (GAtomicArray *array,
      48  				 gsize         header_size,
      49  				 gsize         additional_element_size);
      50  void     _g_atomic_array_update (GAtomicArray *array,
      51  				 gpointer      new_data);
      52  
      53  #define  G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data))
      54  
      55  #define G_ATOMIC_ARRAY_DO_TRANSACTION(_array, _type, _C_) G_STMT_START {	\
      56      gpointer *_datap  = &(_array)->data;				\
      57      _type *transaction_data, *__check;						\
      58  										\
      59      __check = g_atomic_pointer_get (_datap);					\
      60      do {									\
      61        transaction_data = __check;						\
      62        {_C_;}									\
      63        __check = g_atomic_pointer_get (_datap);					\
      64      } while (transaction_data != __check);					\
      65    } G_STMT_END
      66  
      67  G_END_DECLS
      68  
      69  #endif	/* __G_ATOMIC_ARRAY_H__ */