gst/: Remove pre glib2.8 compatibility, fixes #340508
authorWim Taymans <wim.taymans@gmail.com>
Fri, 5 May 2006 08:17:22 +0000 (08:17 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 5 May 2006 08:17:22 +0000 (08:17 +0000)
Original commit message from CVS:
* gst/glib-compat.c:
* gst/gst.c: (init_pre):
* gst/gstobject.c: (gst_object_init), (gst_object_ref),
(gst_object_unref), (gst_object_replace), (gst_object_dispose),
(gst_object_dispatch_properties_changed):
* gst/gstobject.h:
* gst/gstregistryxml.c: (gst_registry_xml_read_cache):
* gst/gststructure.c: (gst_structure_set_valist):
* gst/gstvalue.c: (gst_date_get_type), (_gst_value_initialize):
Remove pre glib2.8 compatibility, fixes #340508

ChangeLog
gst/glib-compat.c
gst/gst.c
gst/gstobject.c
gst/gstobject.h
gst/gstregistryxml.c
gst/gststructure.c
gst/gstvalue.c

index 867c842..0052483 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-05-05  Wim Taymans  <wim@fluendo.com>
+
+       * gst/glib-compat.c:
+       * gst/gst.c: (init_pre):
+       * gst/gstobject.c: (gst_object_init), (gst_object_ref),
+       (gst_object_unref), (gst_object_replace), (gst_object_dispose),
+       (gst_object_dispatch_properties_changed):
+       * gst/gstobject.h:
+       * gst/gstregistryxml.c: (gst_registry_xml_read_cache):
+       * gst/gststructure.c: (gst_structure_set_valist):
+       * gst/gstvalue.c: (gst_date_get_type), (_gst_value_initialize):
+       Remove pre glib2.8 compatibility, fixes #340508
+
 2006-05-04  Tim-Philipp Müller  <tim at centricular dot net>
 
        * gst/gsttaglist.h:
index 905862b..cc6a05c 100644 (file)
 #endif
 
 
-#if !GLIB_CHECK_VERSION (2, 8, 0)
-/**
- * g_mkdir_with_parents:
- * @pathname: a pathname in the GLib file name encoding
- * @mode: permissions to use for newly created directories
- *
- * Create a directory if it doesn't already exist. Create intermediate
- * parent directories as needed, too.
- *
- * Returns: 0 if the directory already exists, or was successfully
- * created. Returns -1 if an error occurred, with errno set.
- *
- * Since: 2.8
- */
-int
-g_mkdir_with_parents (const gchar * pathname, int mode)
-{
-  gchar *fn, *p;
-
-  if (pathname == NULL || *pathname == '\0') {
-    errno = EINVAL;
-    return -1;
-  }
-
-  fn = g_strdup (pathname);
-
-  if (g_path_is_absolute (fn))
-    p = (gchar *) g_path_skip_root (fn);
-  else
-    p = fn;
-
-  do {
-    while (*p && !G_IS_DIR_SEPARATOR (*p))
-      p++;
-
-    if (!*p)
-      p = NULL;
-    else
-      *p = '\0';
-
-    if (!g_file_test (fn, G_FILE_TEST_EXISTS)) {
-      if (g_mkdir (fn, mode) == -1) {
-        int errno_save = errno;
-
-        g_free (fn);
-        errno = errno_save;
-        return -1;
-      }
-    } else if (!g_file_test (fn, G_FILE_TEST_IS_DIR)) {
-      g_free (fn);
-      errno = ENOTDIR;
-      return -1;
-    }
-    if (p) {
-      *p++ = G_DIR_SEPARATOR;
-      while (*p && G_IS_DIR_SEPARATOR (*p))
-        p++;
-    }
-  }
-  while (p);
-
-  g_free (fn);
-
-  return 0;
-}
-#endif
-
-
 /**
  * gst_flags_get_first_value:
  * @flags_class: a #GFlagsClass
index 53d0df1..2b1682e 100644 (file)
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -242,10 +242,6 @@ parse_debug_list (const gchar * list)
 }
 #endif
 
-#ifndef GST_HAVE_GLIB_2_8
-#define G_OPTION_FLAG_NO_ARG 0
-#endif
-
 /**
  * gst_init_get_option_group:
  *
@@ -463,17 +459,10 @@ split_and_iterate (const gchar * stringlist, gchar * separator, GFunc iterator,
 static gboolean
 init_pre (void)
 {
-#ifdef GST_HAVE_GLIB_2_8
   /* GStreamer was built against a GLib >= 2.8 and is therefore not doing
    * the refcount hack. Check that it isn't being run against an older GLib */
   if (glib_major_version < 2 ||
       (glib_major_version == 2 && glib_minor_version < 8)) {
-#else
-  /* GStreamer was built against a GLib < 2.8 and is therefore doing
-   * the refcount hack. Check that it isn't being run against a newer GLib */
-  if (glib_major_version > 2 ||
-      (glib_major_version == 2 && glib_minor_version >= 8)) {
-#endif
     g_warning ("GStreamer was compiled against GLib %d.%d.%d but is running"
         " against %d.%d.%d. This will cause reference counting issues",
         GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION,
index 66e6de4..8f1dd17 100644 (file)
@@ -96,29 +96,6 @@ static GstAllocTrace *_gst_object_trace;
 #endif
 
 #define DEBUG_REFCOUNT
-#ifndef GST_HAVE_GLIB_2_8
-#define REFCOUNT_HACK
-#endif
-
-/* Refcount hack: since glib < 2.8 is not threadsafe, the glib refcounter can be
- * screwed up and the object can be freed unexpectedly. We use an evil hack
- * to work around this problem. We set the glib refcount to a high value so
- * that glib will never unref the object under realistic circumstances. Then
- * we use our own atomic refcounting to do proper MT safe refcounting.
- *
- * The hack has several side-effect. At first you should use
- * gst_object_ref/unref() whenever you can. Next when using
- * g_value_set/get_object(); you need to manually fix the refcount.
- *
- * A proper fix is of course to upgrade to glib 2.8
- */
-#ifdef REFCOUNT_HACK
-#define PATCH_REFCOUNT(obj)    ((GObject*)(obj))->ref_count = 100000;
-#define PATCH_REFCOUNT1(obj)    ((GObject*)(obj))->ref_count = 1;
-#else
-#define PATCH_REFCOUNT(obj)
-#define PATCH_REFCOUNT1(obj)
-#endif
 
 /* Object signals and args */
 enum
@@ -314,10 +291,6 @@ gst_object_init (GTypeInstance * instance, gpointer g_class)
   object->parent = NULL;
   object->name = NULL;
   GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "%p new", object);
-#ifdef REFCOUNT_HACK
-  gst_atomic_int_set (&object->refcount, 1);
-#endif
-  PATCH_REFCOUNT (object);
 
 #ifndef GST_DISABLE_TRACE
   gst_alloc_trace_new (_gst_object_trace, object);
@@ -344,27 +317,14 @@ gst_object_init (GTypeInstance * instance, gpointer g_class)
 gpointer
 gst_object_ref (gpointer object)
 {
-#ifdef REFCOUNT_HACK
-  gint old;
-#endif
-
   g_return_val_if_fail (GST_IS_OBJECT (object), NULL);
 
-#ifdef REFCOUNT_HACK
-  old = g_atomic_int_exchange_and_add (&((GstObject *) object)->refcount, 1);
-#  ifdef DEBUG_REFCOUNT
-  GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "%p ref %d->%d",
-      object, old, old + 1);
-#  endif
-  PATCH_REFCOUNT (object);
-#else
-#  ifdef DEBUG_REFCOUNT
+#ifdef DEBUG_REFCOUNT
   GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "%p ref %d->%d",
       object,
       ((GObject *) object)->ref_count, ((GObject *) object)->ref_count + 1);
-#  endif
-  g_object_ref (object);
 #endif
+  g_object_ref (object);
 
   return object;
 }
@@ -383,27 +343,7 @@ gst_object_ref (gpointer object)
 void
 gst_object_unref (gpointer object)
 {
-#ifdef REFCOUNT_HACK
-  gint old;
-#endif
   g_return_if_fail (GST_IS_OBJECT (object));
-
-#ifdef REFCOUNT_HACK
-  g_return_if_fail (GST_OBJECT_REFCOUNT_VALUE (object) > 0);
-
-  old = g_atomic_int_exchange_and_add (&((GstObject *) object)->refcount, -1);
-
-#  ifdef DEBUG_REFCOUNT
-  GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "%p unref %d->%d",
-      object, old, old - 1);
-#endif
-  if (G_UNLIKELY (old == 1)) {
-    PATCH_REFCOUNT1 (object);
-    g_object_unref (object);
-  } else {
-    PATCH_REFCOUNT (object);
-  }
-#else
   g_return_if_fail (((GObject *) object)->ref_count > 0);
 
 #ifdef DEBUG_REFCOUNT
@@ -412,7 +352,6 @@ gst_object_unref (gpointer object)
       ((GObject *) object)->ref_count, ((GObject *) object)->ref_count - 1);
 #endif
   g_object_unref (object);
-#endif
 }
 
 /**
@@ -471,20 +410,12 @@ gst_object_replace (GstObject ** oldobj, GstObject * newobj)
   g_return_if_fail (newobj == NULL || GST_IS_OBJECT (newobj));
 
 #ifdef DEBUG_REFCOUNT
-#ifdef REFCOUNT_HACK
-  GST_CAT_LOG (GST_CAT_REFCOUNTING, "replace %s (%d) with %s (%d)",
-      *oldobj ? GST_STR_NULL (GST_OBJECT_NAME (*oldobj)) : "(NONE)",
-      *oldobj ? GST_OBJECT_REFCOUNT_VALUE (*oldobj) : 0,
-      newobj ? GST_STR_NULL (GST_OBJECT_NAME (newobj)) : "(NONE)",
-      newobj ? GST_OBJECT_REFCOUNT_VALUE (newobj) : 0);
-#else
   GST_CAT_LOG (GST_CAT_REFCOUNTING, "replace %s (%d) with %s (%d)",
       *oldobj ? GST_STR_NULL (GST_OBJECT_NAME (*oldobj)) : "(NONE)",
       *oldobj ? G_OBJECT (*oldobj)->ref_count : 0,
       newobj ? GST_STR_NULL (GST_OBJECT_NAME (newobj)) : "(NONE)",
       newobj ? G_OBJECT (newobj)->ref_count : 0);
 #endif
-#endif
 
   if (G_LIKELY (*oldobj != newobj)) {
     if (newobj)
@@ -511,9 +442,6 @@ gst_object_dispose (GObject * object)
   GST_OBJECT_PARENT (object) = NULL;
   GST_OBJECT_UNLOCK (object);
 
-  /* need to patch refcount so it is finalized */
-  PATCH_REFCOUNT1 (object);
-
   parent_class->dispose (object);
 
   return;
@@ -526,6 +454,7 @@ have_parent:
         "object instead of unreffing the object directly.\n",
         GST_OBJECT_NAME (object), GST_OBJECT_NAME (parent));
     GST_OBJECT_UNLOCK (object);
+    /* ref the object again to revive it in this error case */
     object = gst_object_ref (object);
     return;
   }
@@ -576,15 +505,9 @@ gst_object_dispatch_properties_changed (GObject * object,
 
   klass = GST_OBJECT_GET_CLASS (object);
 
-#ifndef GST_HAVE_GLIB_2_8
-  GST_CLASS_LOCK (klass);
-#endif
-
   /* do the standard dispatching */
-  PATCH_REFCOUNT (object);
   G_OBJECT_CLASS (parent_class)->dispatch_properties_changed (object, n_pspecs,
       pspecs);
-  PATCH_REFCOUNT (object);
 
   gst_object = GST_OBJECT_CAST (object);
   name = gst_object_get_name (gst_object);
@@ -605,14 +528,9 @@ gst_object_dispatch_properties_changed (GObject * object,
       GST_CAT_LOG (GST_CAT_EVENT, "deep notification from %s to %s (%s)",
           debug_name, debug_parent_name, pspecs[i]->name);
 
-      /* not MT safe because of glib, fixed by taking class lock higher up */
-      PATCH_REFCOUNT (parent);
-      PATCH_REFCOUNT (object);
       g_signal_emit (parent, gst_object_signals[DEEP_NOTIFY],
           g_quark_from_string (pspecs[i]->name), GST_OBJECT_CAST (object),
           pspecs[i]);
-      PATCH_REFCOUNT (parent);
-      PATCH_REFCOUNT (object);
     }
     g_free (parent_name);
 
@@ -621,10 +539,6 @@ gst_object_dispatch_properties_changed (GObject * object,
     gst_object_unref (old_parent);
   }
   g_free (name);
-
-#ifndef GST_HAVE_GLIB_2_8
-  GST_CLASS_UNLOCK (klass);
-#endif
 }
 
 /**
index c25be75..2bc8461 100644 (file)
@@ -62,7 +62,6 @@ typedef enum
   GST_OBJECT_FLAG_LAST = (1<<4)
 } GstObjectFlags;
 
-#ifdef GST_HAVE_GLIB_2_8
 /**
  * GST_OBJECT_REFCOUNT:
  * @obj: a #GstObject
@@ -76,11 +75,7 @@ typedef enum
  *
  * Get the reference count value of the object.
  */
-#define GST_OBJECT_REFCOUNT_VALUE(obj)          GST_OBJECT_REFCOUNT(obj)
-#else
-#define GST_OBJECT_REFCOUNT(obj)                ((GST_OBJECT_CAST(obj))->refcount)
-#define GST_OBJECT_REFCOUNT_VALUE(obj)          (g_atomic_int_get (&(GST_OBJECT_CAST(obj))->refcount))
-#endif /* GST_HAVE_GLIB_2_8 */
+#define GST_OBJECT_REFCOUNT_VALUE(obj)          g_atomic_int_get (&GST_OBJECT_REFCOUNT(obj))
 
 /* we do a GST_OBJECT_CAST to avoid type checking, better call these
  * function with a valid object! */
@@ -186,7 +181,7 @@ typedef struct _GstObjectClass GstObjectClass;
 
 /**
  * GstObject:
- * @refcount: only used ifndef GST_HAVE_GLIB_2_8
+ * @refcount: unused
  * @lock: object LOCK
  * @name: The name of the object
  * @name_prefix: used for debugging
index 1e877de..e431f2d 100644 (file)
@@ -466,9 +466,7 @@ load_plugin (xmlTextReaderPtr reader, GList ** feature_list)
 gboolean
 gst_registry_xml_read_cache (GstRegistry * registry, const char *location)
 {
-#if GLIB_CHECK_VERSION(2,8,0)
   GMappedFile *mapped = NULL;
-#endif
   GTimer *timer;
   gdouble seconds;
   xmlTextReaderPtr reader = NULL;
@@ -483,7 +481,6 @@ gst_registry_xml_read_cache (GstRegistry * registry, const char *location)
 
   timer = g_timer_new ();
 
-#if GLIB_CHECK_VERSION(2,8,0)
   mapped = g_mapped_file_new (location, FALSE, NULL);
   if (mapped) {
     reader = xmlReaderForMemory (g_mapped_file_get_contents (mapped),
@@ -493,7 +490,6 @@ gst_registry_xml_read_cache (GstRegistry * registry, const char *location)
       mapped = NULL;
     }
   }
-#endif
 
   if (reader == NULL) {
     file = fopen (location, "r");
@@ -540,10 +536,8 @@ gst_registry_xml_read_cache (GstRegistry * registry, const char *location)
   xmlFreeTextReader (reader);
   if (ret != 0) {
     GST_ERROR ("parsing registry cache: %s", location);
-#if GLIB_CHECK_VERSION(2,8,0)
     if (mapped)
       g_mapped_file_free (mapped);
-#endif
     if (file)
       fclose (file);
     g_timer_destroy (timer);
@@ -556,10 +550,8 @@ gst_registry_xml_read_cache (GstRegistry * registry, const char *location)
 
   GST_INFO ("loaded %s in %f seconds", location, seconds);
 
-#if GLIB_CHECK_VERSION(2,8,0)
   if (mapped)
     g_mapped_file_free (mapped);
-#endif
 
   if (file)
     fclose (file);
index 04a6a99..8317e51 100644 (file)
@@ -480,12 +480,10 @@ gst_structure_set_valist (GstStructure * structure,
 
     type = va_arg (varargs, GType);
 
-#if GLIB_CHECK_VERSION(2,8,0)
     if (type == G_TYPE_DATE) {
       g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
       type = GST_TYPE_DATE;
     }
-#endif
 
     g_value_init (&field.value, type);
     G_VALUE_COLLECT (&field.value, varargs, 0, &err);
index 0565c63..8d7e4b3 100644 (file)
@@ -3792,7 +3792,7 @@ gst_date_get_type (void)
     /* Not using G_TYPE_DATE here on purpose, even if we could
      * if GLIB_CHECK_VERSION(2,8,0) was true: we don't want the
      * serialised strings to have different type strings depending
-     * on what version is used, so FIXME in 0.11 when we
+     * on what version is used, so FIXME when we
      * require GLib-2.8 */
     gst_date_type = g_boxed_type_register_static ("GstDate",
         (GBoxedCopyFunc) gst_date_copy, (GBoxedFreeFunc) g_date_free);
@@ -4023,14 +4023,12 @@ _gst_value_initialize (void)
       GST_TYPE_FRACTION_RANGE,
       gst_value_subtract_fraction_range_fraction_range);
 
-#if GLIB_CHECK_VERSION(2,8,0)
   /* see bug #317246, #64994, #65041 */
   {
     volatile GType date_type = G_TYPE_DATE;
 
     g_type_name (date_type);
   }
-#endif
 
   gst_value_register_union_func (G_TYPE_INT, GST_TYPE_INT_RANGE,
       gst_value_union_int_int_range);