[Pkg-gstreamer-commits] [SCM] GStreamer Core 1.0 Packaging branch, master, updated. debian/0.11.93-1-2-g427ff61

Sebastian Dröge sebastian.droege at collabora.co.uk
Fri Aug 10 11:06:17 UTC 2012


The following commit has been merged in the master branch:
commit 427ff61c5eb4e91087d7c1df17f4cfd20dbc36a1
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Fri Aug 10 13:00:31 2012 +0200

    debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch: Fix unit test hang that causes the build to fail sometimes

diff --git a/debian/changelog b/debian/changelog
index e49c36e..586fbae 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,11 @@
-gstreamer1.0 (0.11.93-2) UNRELEASED; urgency=low
+gstreamer1.0 (0.11.93-2) experimental; urgency=low
 
   * debian/control.in:
     + Build-depend on GLIB >= 2.23.
+  * debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch:
+    + Fix unit test hang that causes the build to fail sometimes.
 
- -- Sebastian Dröge <slomo at debian.org>  Thu, 09 Aug 2012 11:27:36 +0200
+ -- Sebastian Dröge <slomo at debian.org>  Fri, 10 Aug 2012 12:59:53 +0200
 
 gstreamer1.0 (0.11.93-1) experimental; urgency=low
 
diff --git a/debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch b/debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch
new file mode 100644
index 0000000..a33e72d
--- /dev/null
+++ b/debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch
@@ -0,0 +1,250 @@
+From fe082cbe24a4bfd7131921d820df1b7689da7b66 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim at centricular.net>
+Date: Fri, 10 Aug 2012 09:19:25 +0100
+Subject: [PATCH] netclientclock: simplify by using
+ g_socket_condition_timed_wait()
+
+No need to use a custom main context and custom timeout sources,
+just use g_socket_condition_timed_wait() instead, which was added
+for exactly this case.
+
+Also seems to help with the unit test deadlocking with glib 2.33.x
+
+https://bugzilla.gnome.org/show_bug.cgi?id=681575
+---
+ libs/gst/net/gstnetclientclock.c |  186 +++++++++++---------------------------
+ 1 file changed, 55 insertions(+), 131 deletions(-)
+
+diff --git a/libs/gst/net/gstnetclientclock.c b/libs/gst/net/gstnetclientclock.c
+index 691c414..de9db2b 100644
+--- a/libs/gst/net/gstnetclientclock.c
++++ b/libs/gst/net/gstnetclientclock.c
+@@ -248,70 +248,11 @@ bogus_observation:
+   }
+ }
+ 
+-typedef struct
+-{
+-  GSource source;
+-  GstNetClientClock *clock;
+-  gboolean *p_timeout;
+-} GstNetClientClockTimeoutSource;
+-
+-static gboolean
+-gst_net_client_clock_timeout_source_prepare (GSource * s, gint * p_timeout)
+-{
+-  GstNetClientClockTimeoutSource *source = (GstNetClientClockTimeoutSource *) s;
+-  GstClockTime expiration_time = source->clock->priv->timeout_expiration;
+-  GstClockTime now = gst_util_get_timestamp ();
+-
+-  if (now >= expiration_time || (expiration_time - now) <= GST_MSECOND) {
+-    *p_timeout = 0;
+-    return TRUE;
+-  }
+-
+-  *p_timeout = (expiration_time - now) / GST_MSECOND;
+-  GST_TRACE_OBJECT (source->clock, "time out in %d ms please", *p_timeout);
+-  return FALSE;
+-}
+-
+-static gboolean
+-gst_net_client_clock_timeout_source_check (GSource * s)
+-{
+-  GstNetClientClockTimeoutSource *source = (GstNetClientClockTimeoutSource *) s;
+-
+-  return (gst_util_get_timestamp () >= source->clock->priv->timeout_expiration);
+-}
+-
+-static gboolean
+-gst_net_client_clock_timeout_source_dispatch (GSource * s, GSourceFunc cb,
+-    gpointer data)
+-{
+-  GstNetClientClockTimeoutSource *source = (GstNetClientClockTimeoutSource *) s;
+-
+-  GST_TRACE_OBJECT (source->clock, "timed out");
+-  *source->p_timeout = TRUE;
+-  return TRUE;
+-}
+-
+-static gboolean
+-gst_net_client_clock_socket_cb (GSocket * socket, GIOCondition condition,
+-    gpointer user_data)
+-{
+-  GIOCondition *p_cond = user_data;
+-
+-  GST_TRACE ("socket %p I/O condition: 0x%02x", socket, condition);
+-  *p_cond = condition;
+-  return TRUE;
+-}
+-
+ static gpointer
+ gst_net_client_clock_thread (gpointer data)
+ {
+   GstNetClientClock *self = data;
+   GstNetTimePacket *packet;
+-  GMainContext *ctx;
+-  GSourceFuncs funcs = { NULL, };
+-  GSource *source;
+-  GIOCondition cond;
+-  gboolean timeout;
+   GSocket *socket = self->priv->socket;
+   GError *err = NULL;
+   GstClock *clock = data;
+@@ -321,99 +262,82 @@ gst_net_client_clock_thread (gpointer data)
+   g_socket_set_blocking (socket, TRUE);
+   g_socket_set_timeout (socket, 0);
+ 
+-  ctx = g_main_context_new ();
+-
+-  source = g_socket_create_source (socket, G_IO_IN, self->priv->cancel);
+-  g_source_set_name (source, "GStreamer net client clock thread socket");
+-  g_source_set_callback (source, (GSourceFunc) gst_net_client_clock_socket_cb,
+-      &cond, NULL);
+-  g_source_attach (source, ctx);
+-  g_source_unref (source);
+-
+-  /* GSocket only support second granularity for timeouts, so roll our own
+-   * timeout source (so we don't have to create a new source whenever the
+-   * timeout changes, as we would have to do with the default timeout source) */
+-  funcs.prepare = gst_net_client_clock_timeout_source_prepare;
+-  funcs.check = gst_net_client_clock_timeout_source_check;
+-  funcs.dispatch = gst_net_client_clock_timeout_source_dispatch;
+-  funcs.finalize = NULL;
+-  source = g_source_new (&funcs, sizeof (GstNetClientClockTimeoutSource));
+-  ((GstNetClientClockTimeoutSource *) source)->clock = self;
+-  ((GstNetClientClockTimeoutSource *) source)->p_timeout = &timeout;
+-  g_source_set_name (source, "GStreamer net client clock timeout");
+-  g_source_attach (source, ctx);
+-  g_source_unref (source);
+-
+   while (!g_cancellable_is_cancelled (self->priv->cancel)) {
+-    cond = 0;
+-    timeout = FALSE;
+-    g_main_context_iteration (ctx, TRUE);
+-
+-    if (g_cancellable_is_cancelled (self->priv->cancel))
+-      break;
++    GstClockTime expiration_time = self->priv->timeout_expiration;
++    GstClockTime now = gst_util_get_timestamp ();
++    gint64 socket_timeout;
++
++    if (now >= expiration_time || (expiration_time - now) <= GST_MSECOND) {
++      socket_timeout = 0;
++    } else {
++      socket_timeout = (expiration_time - now) / GST_USECOND;
++    }
+ 
+-    if (timeout) {
+-      /* timed out, let's send another packet */
+-      GST_DEBUG_OBJECT (self, "timed out");
++    GST_TRACE_OBJECT (self, "time out in %d microsecs please", socket_timeout);
+ 
+-      packet = gst_net_time_packet_new (NULL);
++    if (!g_socket_condition_timed_wait (socket, G_IO_IN, socket_timeout,
++            self->priv->cancel, &err)) {
++      /* cancelled, timeout or error */
++      if (err->code == G_IO_ERROR_CANCELLED) {
++        GST_INFO_OBJECT (self, "cancelled");
++        g_clear_error (&err);
++        break;
++      } else if (err->code == G_IO_ERROR_TIMED_OUT) {
++        /* timed out, let's send another packet */
++        GST_DEBUG_OBJECT (self, "timed out");
+ 
+-      packet->local_time = gst_clock_get_internal_time (GST_CLOCK (self));
++        packet = gst_net_time_packet_new (NULL);
+ 
+-      GST_DEBUG_OBJECT (self, "sending packet, local time = %" GST_TIME_FORMAT,
+-          GST_TIME_ARGS (packet->local_time));
++        packet->local_time = gst_clock_get_internal_time (GST_CLOCK (self));
+ 
+-      gst_net_time_packet_send (packet, self->priv->socket,
+-          self->priv->servaddr, NULL);
++        GST_DEBUG_OBJECT (self,
++            "sending packet, local time = %" GST_TIME_FORMAT,
++            GST_TIME_ARGS (packet->local_time));
+ 
+-      g_free (packet);
++        gst_net_time_packet_send (packet, self->priv->socket,
++            self->priv->servaddr, NULL);
+ 
+-      /* reset timeout (but are expecting a response sooner anyway) */
+-      self->priv->timeout_expiration =
+-          gst_util_get_timestamp () + gst_clock_get_timeout (clock);
+-      continue;
+-    }
++        g_free (packet);
+ 
+-    /* got data to read? */
+-    if ((cond & G_IO_IN)) {
++        /* reset timeout (but are expecting a response sooner anyway) */
++        self->priv->timeout_expiration =
++            gst_util_get_timestamp () + gst_clock_get_timeout (clock);
++      } else {
++        GST_DEBUG_OBJECT (self, "socket error: %s", err->message);
++        g_usleep (G_USEC_PER_SEC / 10); /* throttle */
++      }
++      g_clear_error (&err);
++    } else {
+       GstClockTime new_local;
+ 
++      /* got packet */
++
+       new_local = gst_clock_get_internal_time (GST_CLOCK (self));
+ 
+       packet = gst_net_time_packet_receive (socket, NULL, &err);
+ 
+-      if (err != NULL) {
++      if (packet != NULL) {
++        GST_LOG_OBJECT (self, "got packet back");
++        GST_LOG_OBJECT (self, "local_1 = %" GST_TIME_FORMAT,
++            GST_TIME_ARGS (packet->local_time));
++        GST_LOG_OBJECT (self, "remote = %" GST_TIME_FORMAT,
++            GST_TIME_ARGS (packet->remote_time));
++        GST_LOG_OBJECT (self, "local_2 = %" GST_TIME_FORMAT,
++            GST_TIME_ARGS (new_local));
++
++        /* observe_times will reset the timeout */
++        gst_net_client_clock_observe_times (self, packet->local_time,
++            packet->remote_time, new_local);
++
++        g_free (packet);
++      } else if (err != NULL) {
+         GST_WARNING_OBJECT (self, "receive error: %s", err->message);
+-        g_error_free (err);
+-        err = NULL;
+-        continue;
++        g_clear_error (&err);
+       }
+-
+-      GST_LOG_OBJECT (self, "got packet back");
+-      GST_LOG_OBJECT (self, "local_1 = %" GST_TIME_FORMAT,
+-          GST_TIME_ARGS (packet->local_time));
+-      GST_LOG_OBJECT (self, "remote = %" GST_TIME_FORMAT,
+-          GST_TIME_ARGS (packet->remote_time));
+-      GST_LOG_OBJECT (self, "local_2 = %" GST_TIME_FORMAT,
+-          GST_TIME_ARGS (new_local));
+-
+-      /* observe_times will reset the timeout */
+-      gst_net_client_clock_observe_times (self, packet->local_time,
+-          packet->remote_time, new_local);
+-
+-      g_free (packet);
+-      continue;
+-    }
+-
+-    if ((cond & (G_IO_ERR | G_IO_HUP))) {
+-      GST_DEBUG_OBJECT (self, "socket error?! %s", g_strerror (errno));
+-      g_usleep (G_USEC_PER_SEC / 10);
+-      continue;
+     }
+   }
+ 
+   GST_INFO_OBJECT (self, "shutting down net client clock thread");
+-  g_main_context_unref (ctx);
+   return NULL;
+ }
+ 
+-- 
+1.7.10.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 2497acb..b41ec30 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
 99_ltmain_as-needed.patch
+0001-netclientclock-simplify-by-using-g_socket_condition_.patch

-- 
GStreamer Core 1.0 Packaging



More information about the Pkg-gstreamer-commits mailing list