2005-04-24 David Schleef <ds@schleef.org>
+ Convert everything from GstAtomicInt to g_atomic_int_*, and
+ remove gstatomic.
+ * gst/Makefile.am:
+ * gst/gstatomic.c:
+ * gst/gstatomic.h:
+ * gst/gstatomic_impl.h:
+ * gst/gstbuffer.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstdata.c:
+ * gst/gstdata.h:
+ * gst/gstdata_private.h:
+ * gst/gstevent.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstmessage.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstutils.c: Add gst_atomic_int_set() compaitibility function.
+ * gst/gstutils.h:
+
+2005-04-24 David Schleef <ds@schleef.org>
+
* check/gst/gstpad.c: (START_TEST): Oh yeah, it's always nice to
make the regressions tests work. Remove some code that is no
longer true.
libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
gst.c \
gstobject.c \
- gstatomic.c \
gstbin.c \
gstbuffer.c \
gstbus.c \
gst_headers = \
gst.h \
- gstatomic.h \
gstobject.h \
gstbin.h \
gstbuffer.h \
gst-i18n-lib.h \
gst-i18n-app.h \
gst_private.h \
- gstatomic_impl.h \
gstdata_private.h \
gstarch.h \
cothreads.h
+++ /dev/null
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library 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.
- */
-
-#define GST_IMPLEMENT_INLINES 1
-#define __GST_ATOMIC_C__
-
-#include "gst_private.h"
-#include "gstatomic.h"
-#include "gstatomic_impl.h"
+++ /dev/null
-/* GStreamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library 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.
- */
-
-#ifndef __GST_ATOMIC_H__
-#define __GST_ATOMIC_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-typedef volatile gint gst_vgint; /* gtk-doc volatile workaround */
-
-typedef struct _GstAtomicInt GstAtomicInt;
-
-struct _GstAtomicInt {
- gst_vgint counter;
- GMutex *lock; /* for C fallback */
-};
-
-
-void gst_atomic_int_init (GstAtomicInt *aint, gint val);
-void gst_atomic_int_destroy (GstAtomicInt *aint);
-void gst_atomic_int_set (GstAtomicInt *aint, gint val);
-gint gst_atomic_int_read (GstAtomicInt *aint);
-void gst_atomic_int_add (GstAtomicInt *aint, gint val);
-void gst_atomic_int_inc (GstAtomicInt *aint);
-gboolean gst_atomic_int_dec_and_test (GstAtomicInt *aint);
-
-
-G_END_DECLS
-
-#endif /* __GST_ATOMIC_H__ */
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999, 2003 Erik Walthinsen <omega@cse.ogi.edu>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library 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.
- *
- *
- * Much of the code in this file is taken from the Linux kernel.
- * The code is relicensed under the LGPL with the kind permission of
- * Linus Torvalds,Ralf Baechle and Alan Cox
- */
-
-#ifndef __GST_ATOMIC_IMPL_H__
-#define __GST_ATOMIC_IMPL_H__
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib.h>
-#include "gstatomic.h"
-#include "gstmacros.h"
-
-G_BEGIN_DECLS
-
-#if defined (GST_CAN_INLINE) || defined (__GST_ATOMIC_C__)
-
-/***** Intel x86 *****/
-#if (defined (HAVE_CPU_I386) || defined (HAVE_CPU_X86_64)) && defined(__GNUC__)
-
-#ifdef GST_CONFIG_NO_SMP
-#define SMP_LOCK ""
-#else
-#define SMP_LOCK "lock ; "
-#endif
-
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- __asm__ __volatile__(
- SMP_LOCK "addl %1,%0"
- :"=m" (aint->counter)
- :"ir" (val), "m" (aint->counter));
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- __asm__ __volatile__(
- SMP_LOCK "incl %0"
- :"=m" (aint->counter)
- :"m" (aint->counter));
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- guchar res;
-
- __asm__ __volatile__(
- SMP_LOCK "decl %0; sete %1"
- :"=m" (aint->counter), "=qm" (res)
- :"m" (aint->counter) : "memory");
-
- return res != 0;
-}
-
-/***** PowerPC *****/
-#elif defined (HAVE_CPU_PPC) && defined(__GNUC__)
-
-#ifdef GST_CONFIG_NO_SMP
-#define SMP_SYNC ""
-#define SMP_ISYNC
-#else
-#define SMP_SYNC "\tsync\n"
-#define SMP_ISYNC "\tisync\n"
-#endif
-
-/* Erratum #77 on the 405 means we need a sync or dcbt before every stwcx.
- * The old ATOMIC_SYNC_FIX covered some but not all of this.
- */
-#ifdef GST_CONFIG_IBM405_ERR77
-#define PPC405_ERR77(ra,rb) "\tdcbt " #ra "," #rb "\n"
-#else
-#define PPC405_ERR77(ra,rb)
-#endif
-
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- int t;
-
- __asm__ __volatile__(
- "1: lwarx %0,0,%3\n"
- " add %0,%2,%0\n"
- PPC405_ERR77(0,%3)
- " stwcx. %0,0,%3 \n"
- " bne- 1b\n"
- : "=&r" (t), "=m" (aint->counter)
- : "r" (val), "r" (&aint->counter), "m" (aint->counter)
- : "cc");
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- int t;
-
- __asm__ __volatile__(
- "1: lwarx %0,0,%2\n"
- " addic %0,%0,1\n"
- PPC405_ERR77(0,%2)
- " stwcx. %0,0,%2\n"
- " bne- 1b\n"
- : "=&r" (t), "=m" (aint->counter)
- : "r" (&aint->counter), "m" (aint->counter)
- : "cc");
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- int t;
-
- __asm__ __volatile__(
- "1: lwarx %0,0,%1\n"
- " addic %0,%0,-1\n"
- PPC405_ERR77(0,%1)
- " stwcx. %0,0,%1\n"
- " bne- 1b\n"
- SMP_ISYNC
- : "=&r" (t)
- : "r" (&aint->counter)
- : "cc", "memory");
-
- return t == 0;
-}
-
-/***** DEC[/Compaq/HP?/Intel?] Alpha *****/
-#elif defined(HAVE_CPU_ALPHA) && defined(__GNUC__)
-
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- unsigned long temp;
-
- __asm__ __volatile__(
- "1: ldl_l %0,%1\n"
- " addl %0,%2,%0\n"
- " stl_c %0,%1\n"
- " beq %0,2f\n"
- ".subsection 2\n"
- "2: br 1b\n"
- ".previous"
- :"=&r" (temp), "=m" (aint->counter)
- :"Ir" (val), "m" (aint->counter));
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- gst_atomic_int_add (aint, 1);
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- long temp, result;
- int val = 1;
- __asm__ __volatile__(
- "1: ldl_l %0,%1\n"
- " subl %0,%3,%2\n"
- " subl %0,%3,%0\n"
- " stl_c %0,%1\n"
- " beq %0,2f\n"
- " mb\n"
- ".subsection 2\n"
- "2: br 1b\n"
- ".previous"
- :"=&r" (temp), "=m" (aint->counter), "=&r" (result)
- :"Ir" (val), "m" (aint->counter) : "memory");
-
- return result == 0;
-}
-
-/***** Sun SPARC *****/
-#elif 0 && defined(HAVE_CPU_SPARC) && defined(__GNUC__)
-/* allegedly broken again */
-
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-
-#ifdef GST_CONFIG_NO_SMP
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-#else
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = (val<<8); }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = (val<<8); }
-
-/*
- * For SMP the trick is you embed the spin lock byte within
- * the word, use the low byte so signedness is easily retained
- * via a quick arithmetic shift. It looks like this:
- *
- * ----------------------------------------
- * | signed 24-bit counter value | lock | atomic_t
- * ----------------------------------------
- * 31 8 7 0
- */
-GST_INLINE_FUNC gint
-gst_atomic_int_read (GstAtomicInt *aint)
-{
- int ret = aint->counter;
-
- while (ret & 0xff)
- ret = aint->counter;
-
- return ret >> 8;
-}
-#endif /* GST_CONFIG_NO_SMP */
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- volatile int increment, *ptr;
- int lock = 1;
- int ignore = 0;
-
- ptr = &(aint->counter);
-
-#if __GNUC__ > 3 || (__GNUC__ >=3 && __GNUC_MINOR__ >= 2)
- __asm__ __volatile__("1: ldstub [%[ptr] + 3], %[lock]\n"
- "\torcc %[lock], 0, %[ignore]\n"
- "\tbne 1b\n" /* go back until we have the lock */
- "\tld [%[ptr]], %[inc]\n"
- "\tsra %[inc], 8, %[inc]\n"
- "\tadd %[inc], %[val], %[inc]\n"
- "\tsll %[inc], 8, %[lock]\n"
- "\tst %[lock],[%[ptr]]\n" /* Release the lock */
- : [inc] "=&r" (increment), [lock] "=r" (lock),
- [ignore] "=&r" (ignore)
- : "0" (increment), [ptr] "r" (ptr), [val] "r" (val)
- );
-#else
- __asm__ __volatile__("1: ldstub [%4 + 3], %1\n"
- "\torcc %1, 0, %2\n"
- "\tbne 1b\n" /* go back until we have the lock */
- "\tld [%4], %0\n"
- "\tsra %0, 8, %0\n"
- "\tadd %0, %5, %0\n"
- "\tsll %0, 8, %1\n"
- "\tst %1,[%4]\n" /* Release the lock */
- : "=&r" (increment), "=r" (lock), "=&r" (ignore)
- : "0" (increment), "r" (ptr), "r" (val)
- );
-#endif
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- gst_atomic_int_add (aint, 1);
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- volatile int increment, *ptr;
- int lock = 1;
- int ignore = 0;
-
- ptr = &aint->counter;
-
-#if __GNUC__ > 3 || (__GNUC__ >=3 && __GNUC_MINOR__ >= 2)
- __asm__ __volatile__("1: ldstub [%[ptr] + 3], %[lock]\n"
- "\torcc %[lock], 0, %[ignore]\n"
- "\tbne 1b\n" /* go back until we have the lock */
- "\tld [%[ptr]], %[inc]\n"
- "\tsra %[inc], 8, %[inc]\n"
- "\tsub %[inc], 1, %[inc]\n"
- "\tsll %[inc], 8, %[lock]\n"
- "\tst %[lock],[%[ptr]]\n" /* Release the lock */
- : [inc] "=&r" (increment), [lock] "=r" (lock),
- [ignore] "=&r" (ignore)
- : "0" (increment), [ptr] "r" (ptr)
- );
-#else
- __asm__ __volatile__("1: ldstub [%4 + 3], %1\n"
- "\torcc %1, 0, %2\n"
- "\tbne 1b\n" /* go back until we have the lock */
- "\tld [%4], %0\n"
- "\tsra %0, 8, %0\n"
- "\tsub %0, 1, %0\n"
- "\tsll %0, 8, %1\n"
- "\tst %1,[%4]\n" /* Release the lock */
- : "=&r" (increment), "=r" (lock), "=&r" (ignore)
- : "0" (increment), "r" (ptr)
- );
-#endif
-
- return increment == 0;
-}
-
-/***** MIPS *****/
-/* This is disabled because the asm code is broken on most MIPS
- * processors and doesn't generally compile. */
-#elif defined(HAVE_CPU_MIPS) && defined(__GNUC__) && 0
-
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-
-/* this only works on MIPS II and better */
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- unsigned long temp;
-
- __asm__ __volatile__(
- "1: ll %0, %1 # atomic_add\n"
- " addu %0, %2 \n"
- " sc %0, %1 \n"
- " beqz %0, 1b \n"
- : "=&r" (temp), "=m" (aint->counter)
- : "Ir" (val), "m" (aint->counter));
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- gst_atomic_int_add (aint, 1);
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- unsigned long temp, result;
- int val = 1;
-
- __asm__ __volatile__(
- ".set push \n"
- ".set noreorder # atomic_sub_return\n"
- "1: ll %1, %2 \n"
- " subu %0, %1, %3 \n"
- " sc %0, %2 \n"
- " beqz %0, 1b \n"
- " subu %0, %1, %3 \n"
- ".set pop \n"
- : "=&r" (result), "=&r" (temp), "=m" (aint->counter)
- : "Ir" (val), "m" (aint->counter)
- : "memory");
-
- return result == 0;
-}
-
-/***** S/390 *****/
-#elif defined(HAVE_CPU_S390) && defined(__GNUC__)
-typedef struct { volatile int counter; } atomic_t __attribute__ ((aligned (4)));
-
-GST_INLINE_FUNC void gst_atomic_int_init (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC void gst_atomic_int_destroy (GstAtomicInt *aint) { }
-GST_INLINE_FUNC void gst_atomic_int_set (GstAtomicInt *aint, gint val) { aint->counter = val; }
-GST_INLINE_FUNC gint gst_atomic_int_read (GstAtomicInt *aint) { return aint->counter; }
-
-#define __CS_LOOP(old_val, new_val, ptr, op_val, op_string) \
- __asm__ __volatile__(" l %0,0(%3)\n" \
- "0: lr %1,%0\n" \
- op_string " %1,%4\n" \
- " cs %0,%1,0(%3)\n" \
- " jl 0b" \
- : "=&d" (old_val), "=&d" (new_val), \
- "+m" (((atomic_t *)(ptr))->counter) \
- : "a" (ptr), "d" (op_val) : "cc" );
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- int old_val, new_val;
- __CS_LOOP(old_val, new_val, aint, val, "ar");
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- int old_val, new_val;
- __CS_LOOP(old_val, new_val, aint, 1, "ar");
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- int old_val, new_val;
- __CS_LOOP(old_val, new_val, aint, 1, "sr");
- return new_val == 0;
-}
-
-#else
-
-/* no need warning about this if we can't do inline assembly */
-#ifdef __GNUC__
-#warning consider putting your architecture specific atomic implementations here
-#endif
-
-/*
- * generic implementation
- */
-GST_INLINE_FUNC void
-gst_atomic_int_init (GstAtomicInt *aint, gint val)
-{
- aint->counter = val;
- aint->lock = g_mutex_new ();
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_destroy (GstAtomicInt *aint)
-{
- g_mutex_free (aint->lock);
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_set (GstAtomicInt *aint, gint val)
-{
- g_mutex_lock (aint->lock);
- aint->counter = val;
- g_mutex_unlock (aint->lock);
-}
-
-GST_INLINE_FUNC gint
-gst_atomic_int_read (GstAtomicInt *aint)
-{
- gint res;
-
- g_mutex_lock (aint->lock);
- res = aint->counter;
- g_mutex_unlock (aint->lock);
-
- return res;
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_add (GstAtomicInt *aint, gint val)
-{
- g_mutex_lock (aint->lock);
- aint->counter += val;
- g_mutex_unlock (aint->lock);
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_inc (GstAtomicInt *aint)
-{
- g_mutex_lock (aint->lock);
- aint->counter++;
- g_mutex_unlock (aint->lock);
-}
-
-GST_INLINE_FUNC gboolean
-gst_atomic_int_dec_and_test (GstAtomicInt *aint)
-{
- gboolean res;
-
- g_mutex_lock (aint->lock);
- aint->counter--;
- res = (aint->counter == 0);
- g_mutex_unlock (aint->lock);
-
- return res;
-}
-
-#endif
-/*
- * common functions
- */
-GST_INLINE_FUNC GstAtomicInt*
-gst_atomic_int_new (gint val)
-{
- GstAtomicInt *aint;
-
- aint = g_new0 (GstAtomicInt, 1);
- gst_atomic_int_init (aint, val);
-
- return aint;
-}
-
-GST_INLINE_FUNC void
-gst_atomic_int_free (GstAtomicInt *aint)
-{
- gst_atomic_int_destroy (aint);
- g_free (aint);
-}
-
-#endif /* defined (GST_CAN_INLINE) || defined (__GST_TRASH_STACK_C__)*/
-
-G_END_DECLS
-
-#endif /* __GST_ATOMIC_IMPL_H__ */
#include "gst_private.h"
-#include "gstatomic_impl.h"
#include "gstdata_private.h"
#include "gstbuffer.h"
#include "gstmemchunk.h"
#include "gstinfo.h"
+#include "gstutils.h"
GType _gst_buffer_type = 0;
#include <signal.h>
#include "gst_private.h"
-#include "gstatomic_impl.h"
#include <gst/gst.h>
/* #define DEBUG_REFCOUNT */
} \
} G_STMT_END
#define IS_WRITABLE(caps) \
- (gst_atomic_int_read(&(caps)->refcount) == 1)
+ (g_atomic_int_get (&(caps)->refcount) == 1)
static void gst_caps_transform_to_string (const GValue * src_value,
{
GstCaps *caps = g_new0 (GstCaps, 1);
- gst_atomic_int_init (&(caps)->refcount, 1);
+ g_atomic_int_inc (&caps->refcount);
caps->type = GST_TYPE_CAPS;
caps->structs = g_ptr_array_new ();
#ifdef USE_POISONING
memset (caps, 0xff, sizeof (GstCaps));
#endif
- gst_atomic_int_destroy (&(caps)->refcount);
g_free (caps);
}
g_return_val_if_fail (caps != NULL, NULL);
/* we are the only instance reffing this caps */
- if (gst_atomic_int_read (&caps->refcount) == 1)
+ if (g_atomic_int_get (&caps->refcount) == 1)
return caps;
/* else copy */
#endif
g_return_val_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0, NULL);
- gst_atomic_int_inc (&caps->refcount);
+ g_atomic_int_inc (&caps->refcount);
return caps;
}
g_return_if_fail (GST_CAPS_REFCOUNT_VALUE (caps) > 0);
/* if we ended up with the refcount at zero, free the caps */
- if (gst_atomic_int_dec_and_test (&caps->refcount)) {
+ if (g_atomic_int_dec_and_test (&caps->refcount)) {
_gst_caps_free (caps);
}
}
gboolean ret;
if (caps->type == 0) {
+ if (static_caps->string == NULL) {
+ g_warning ("static caps is NULL");
+ return NULL;
+ }
+
caps->type = GST_TYPE_CAPS;
/* initialize the caps to a refcount of 1 so the caps can be writable... */
- gst_atomic_int_init (&(caps)->refcount, 1);
+ gst_atomic_int_set (&caps->refcount, 1);
caps->structs = g_ptr_array_new ();
ret = gst_caps_from_string_inplace (caps, static_caps->string);
/* refcount */
#define GST_CAPS_REFCOUNT(caps) ((GST_CAPS(caps))->refcount)
-#define GST_CAPS_REFCOUNT_VALUE(caps) (gst_atomic_int_read (&(GST_CAPS(caps))->refcount))
+#define GST_CAPS_REFCOUNT_VALUE(caps) (g_atomic_int_get (&(GST_CAPS(caps))->refcount))
struct _GstCaps {
GType type;
/*< public >*/ /* with COW */
/* refcounting */
- GstAtomicInt refcount;
+ gint refcount;
guint16 flags;
GPtrArray *structs;
#include "gstclock.h"
#include "gstinfo.h"
#include "gstmemchunk.h"
-#include "gstatomic_impl.h"
+#include "gstutils.h"
#ifndef GST_DISABLE_TRACE
/* #define GST_WITH_ALLOC_TRACE */
#endif
GST_CAT_DEBUG (GST_CAT_CLOCK, "created entry %p", entry);
- gst_atomic_int_init (&entry->refcount, 1);
+ gst_atomic_int_set (&entry->refcount, 1);
entry->clock = clock;
entry->time = time;
entry->interval = interval;
{
g_return_val_if_fail (id != NULL, NULL);
- gst_atomic_int_inc (&((GstClockEntry *) id)->refcount);
+ g_atomic_int_inc (&((GstClockEntry *) id)->refcount);
return id;
}
g_return_if_fail (id != NULL);
- zero = gst_atomic_int_dec_and_test (&((GstClockEntry *) id)->refcount);
+ zero = g_atomic_int_dec_and_test (&((GstClockEntry *) id)->refcount);
/* if we ended up with the refcount at zero, free the id */
if (zero) {
_gst_clock_id_free (id);
#define GST_CLOCK_ENTRY_STATUS(entry) ((entry)->status)
struct _GstClockEntry {
- GstAtomicInt refcount;
+ gint refcount;
/*< protected >*/
GstClock *clock;
GstClockEntryType type;
#include "gst_private.h"
-#include "gstatomic_impl.h"
#include "gstdata.h"
#include "gstdata_private.h"
#include "gstinfo.h"
+#include "gstutils.h"
GType
gst_data_get_type (void)
g_return_val_if_fail (data != NULL, FALSE);
- refcount = gst_atomic_int_read (&data->refcount);
+ refcount = g_atomic_int_get (&data->refcount);
/* if we have the only ref and the data is not readonly, we can
* safely write */
g_return_val_if_fail (data != NULL, NULL);
- refcount = gst_atomic_int_read (&data->refcount);
+ refcount = g_atomic_int_get (&data->refcount);
/* if we have the only ref and the data is not readonly, we can
* safely write, so we return the input data */
GST_CAT_LOG (GST_CAT_BUFFER, "%p %d->%d", data,
GST_DATA_REFCOUNT_VALUE (data), GST_DATA_REFCOUNT_VALUE (data) + 1);
- gst_atomic_int_inc (&data->refcount);
+ g_atomic_int_inc (&data->refcount);
return data;
}
GST_CAT_LOG (GST_CAT_BUFFER, "%p %d->%d", data,
GST_DATA_REFCOUNT_VALUE (data), GST_DATA_REFCOUNT_VALUE (data) + count);
- gst_atomic_int_add (&data->refcount, count);
+ g_atomic_int_add (&data->refcount, count);
return data;
}
GST_DATA_REFCOUNT_VALUE (data), GST_DATA_REFCOUNT_VALUE (data) - 1);
g_return_if_fail (GST_DATA_REFCOUNT_VALUE (data) > 0);
- zero = gst_atomic_int_dec_and_test (&data->refcount);
+ zero = g_atomic_int_dec_and_test (&data->refcount);
/* if we ended up with the refcount at zero, free the data */
if (zero) {
#define __GST_DATA_H__
#include <glib-object.h>
-#include <gst/gstatomic.h>
#include <gst/gsttypes.h>
G_BEGIN_DECLS
/* refcount */
#define GST_DATA_REFCOUNT(data) ((GST_DATA(data))->refcount)
-#define GST_DATA_REFCOUNT_VALUE(data) (gst_atomic_int_read (&(GST_DATA(data))->refcount))
+#define GST_DATA_REFCOUNT_VALUE(data) (g_atomic_int_get (&(GST_DATA(data))->refcount))
/* copy/free functions */
#define GST_DATA_COPY_FUNC(data) (GST_DATA(data)->copy)
/*< public >*/ /* with COW */
/* refcounting */
- GstAtomicInt refcount;
+ gint refcount;
guint16 flags;
* Boston, MA 02111-1307, USA.
*/
-#include "gstatomic_impl.h"
-
#define _GST_DATA_INIT(data, ptype, pflags, pfree, pcopy) \
G_STMT_START { \
- gst_atomic_int_init (&(data)->refcount, 1); \
+ gst_atomic_int_set (&(data)->refcount, 1); \
(data)->type = ptype; \
(data)->flags = pflags; \
(data)->free = pfree; \
#define _GST_DATA_DISPOSE(data) \
G_STMT_START { \
- gst_atomic_int_destroy (&(data)->refcount); \
} G_STMT_END;
#include "gstmemchunk.h"
#include "gstevent.h"
#include "gsttag.h"
+#include "gstutils.h"
#ifndef GST_DISABLE_TRACE
/* #define GST_WITH_ALLOC_TRACE */
#include "gstpad.h"
#include "gstscheduler.h"
#include "gst_private.h"
-#include "gstatomic_impl.h"
+#include "gstutils.h"
#ifdef HAVE_VALGRIND
#include <valgrind/valgrind.h>
#endif
static GStaticMutex __log_func_mutex = G_STATIC_MUTEX_INIT;
static GSList *__log_functions = NULL;
-static GstAtomicInt __default_level;
-static GstAtomicInt __use_color;
+static gint __default_level;
+static gint __use_color;
gboolean __gst_debug_enabled = TRUE;
{
GTimeVal current;
- gst_atomic_int_init (&__default_level, GST_LEVEL_DEFAULT);
- gst_atomic_int_init (&__use_color, 1);
+ gst_atomic_int_set (&__default_level, GST_LEVEL_DEFAULT);
+ gst_atomic_int_set (&__use_color, 1);
/* get time we started for debugging messages */
g_get_current_time (¤t);
gboolean
gst_debug_is_colored (void)
{
- return gst_atomic_int_read (&__use_color) == 0 ? FALSE : TRUE;
+ return g_atomic_int_get (&__use_color) == 0 ? FALSE : TRUE;
}
/**
GstDebugLevel
gst_debug_get_default_threshold (void)
{
- return (GstDebugLevel) gst_atomic_int_read (&__default_level);
+ return (GstDebugLevel) g_atomic_int_get (&__default_level);
}
static void
gst_debug_reset_threshold (gpointer category, gpointer unused)
} else {
cat->description = g_strdup ("no description");
}
- cat->threshold = g_new (GstAtomicInt, 1);
- gst_atomic_int_init (cat->threshold, 0);
+ gst_atomic_int_set (&cat->threshold, 0);
gst_debug_reset_threshold (cat, NULL);
/* add to category list */
g_free ((gpointer) category->name);
g_free ((gpointer) category->description);
- gst_atomic_int_destroy (category->threshold);
- g_free (category->threshold);
g_free (category);
}
{
g_return_if_fail (category != NULL);
- gst_atomic_int_set (category->threshold, level);
+ gst_atomic_int_set (&category->threshold, level);
}
/**
GstDebugLevel
gst_debug_category_get_threshold (GstDebugCategory * category)
{
- return gst_atomic_int_read (category->threshold);
+ return g_atomic_int_get (&category->threshold);
}
/**
#include <glib.h>
#include <glib-object.h>
-#include <gst/gstatomic.h>
#include <gst/gstconfig.h>
G_BEGIN_DECLS
typedef struct _GstDebugCategory GstDebugCategory;
struct _GstDebugCategory {
/*< private >*/
- GstAtomicInt * threshold;
+ gint threshold;
guint color; /* see defines above */
const gchar * name;
#include "gstmemchunk.h"
#include "gstmessage.h"
#include "gsttag.h"
+#include "gstutils.h"
#ifndef GST_DISABLE_TRACE
/* #define GST_WITH_ALLOC_TRACE */
#include "gstobject.h"
#include "gstmarshal.h"
#include "gstinfo.h"
-#include "gstatomic_impl.h"
+#include "gstutils.h"
#ifndef GST_DISABLE_TRACE
#include "gsttrace.h"
object->lock = g_mutex_new ();
object->parent = NULL;
object->name = NULL;
- gst_atomic_int_init (&(object)->refcount, 1);
+ gst_atomic_int_set (&object->refcount, 1);
PATCH_REFCOUNT (object);
gst_object_set_name_default (object, G_OBJECT_CLASS_NAME (g_class));
#endif
#ifdef REFCOUNT_HACK
- gst_atomic_int_inc (&object->refcount);
+ g_atomic_int_inc (&object->refcount);
PATCH_REFCOUNT (object);
#else
/* FIXME, not MT safe because glib is not MT safe */
#endif
#ifdef REFCOUNT_HACK
- if (G_UNLIKELY (gst_atomic_int_dec_and_test (&object->refcount))) {
+ if (G_UNLIKELY (g_atomic_int_dec_and_test (&object->refcount))) {
PATCH_REFCOUNT1 (object);
g_object_unref (object);
} else {
#include <glib-object.h> /* note that this gets wrapped in __GST_OBJECT_H__ */
-#include <gst/gstatomic.h>
#include <gst/gsttypes.h>
G_BEGIN_DECLS
} GstObjectFlags;
#define GST_OBJECT_REFCOUNT(caps) ((GST_OBJECT_CAST(caps))->refcount)
-#define GST_OBJECT_REFCOUNT_VALUE(caps) (gst_atomic_int_read (&(GST_OBJECT_CAST(caps))->refcount))
+#define GST_OBJECT_REFCOUNT_VALUE(caps) (g_atomic_int_get (&(GST_OBJECT_CAST(caps))->refcount))
/* we do a GST_OBJECT_CAST to avoid type checking, better call these
* function with a valid object! */
GObject object;
/*< public >*/
- GstAtomicInt refcount;
+ gint refcount;
/*< public >*/ /* with LOCK */
GMutex *lock; /* object LOCK */
#define IS_MUTABLE(structure) \
(!(structure)->parent_refcount || \
- gst_atomic_int_read ((structure)->parent_refcount) == 1)
+ g_atomic_int_get ((structure)->parent_refcount) == 1)
static void gst_structure_set_field (GstStructure * structure,
GstStructureField * field);
/**
* gst_structure_set_parent_refcount:
* @structure: a #GstStructure
- * @refcount: a pointer to the parent's #GstAtomicInt refcount
+ * @refcount: a pointer to the parent's refcount
*
* Sets the parent_refcount field of #GstStructure. This field is used to
* determine whether a structure is mutable or not. This function should only be
* Returns: a new #GstStructure.
*/
void
-gst_structure_set_parent_refcount (GstStructure * structure,
- GstAtomicInt * refcount)
+gst_structure_set_parent_refcount (GstStructure * structure, int *refcount)
{
g_return_if_fail (structure != NULL);
GQuark name;
/* owned by parent structure, NULL if no parent */
- GstAtomicInt *parent_refcount;
+ gint *parent_refcount;
GArray *fields;
va_list varargs);
GstStructure * gst_structure_copy (const GstStructure *structure);
void gst_structure_set_parent_refcount (GstStructure *structure,
- GstAtomicInt *refcount);
+ gint *refcount);
void gst_structure_free (GstStructure *structure);
G_CONST_RETURN gchar * gst_structure_get_name (const GstStructure *structure);
/* ok not to unset the gvalue */
return g_value_get_boolean (&ret);
}
+
+
+/**
+ * gst_atomic_int_set:
+ * @atomic_int: pointer to an atomic integer
+ * @value: value to set
+ *
+ * Unconditionally sets the atomic integer to @value.
+ */
+void
+gst_atomic_int_set (gint * atomic_int, gint value)
+{
+ int ignore;
+
+ *atomic_int = value;
+ ignore = g_atomic_int_get (atomic_int);
+}
GstBuffer * gst_buffer_merge (GstBuffer * buf1, GstBuffer * buf2);
void gst_buffer_stamp (GstBuffer * dest, const GstBuffer * src);
+/* atomic functions */
+void gst_atomic_int_set (gint * atomic_int, gint value);
G_END_DECLS