/* GObject - GLib Type, Object, Parameter and Signal Library
 * Copyright (C) 2009 Benjamin Otte <otte@gnome.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA 02111-1307, USA.
 */
#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
#error "Only <glib-object.h> can be included directly."
#endif

#ifndef __G_ATOMIC_ARRAY_H__
#define __G_ATOMIC_ARRAY_H__

#include <glib/glib.h>

G_BEGIN_DECLS

#define G_ATOMIC_ARRAY_DATA_SIZE(mem) (*((gsize *) (mem) - 1))

typedef struct _GAtomicArray GAtomicArray;
struct _GAtomicArray {
  volatile gpointer data;               /* elements - atomic */
};

void     _g_atomic_array_init   (GAtomicArray *array);
gpointer _g_atomic_array_copy   (GAtomicArray *array,
				 gsize         header_size,
				 gsize         additional_element_size);
void     _g_atomic_array_update (GAtomicArray *array,
				 gpointer      new_data);

#define  G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data))

#define G_ATOMIC_ARRAY_DO_TRANSACTION(_array, _type, _C_) G_STMT_START {	\
    volatile gpointer *_datap  = &(_array)->data;				\
    _type *transaction_data, *__check;						\
										\
    __check = g_atomic_pointer_get (_datap);					\
    do {									\
      transaction_data = __check;						\
      {_C_;}									\
      __check = g_atomic_pointer_get (_datap);					\
    } while (transaction_data != __check);					\
  } G_STMT_END

G_END_DECLS

#endif	/* __G_ATOMIC_ARRAY_H__ */
