aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-08-10 13:00:31 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-08-10 13:00:31 +0200
commit427ff61c5eb4e91087d7c1df17f4cfd20dbc36a1 (patch)
tree072bbdd30494b329d87c99b37c3415d0afd135b1
parent30fd492292b47d1e0fb69fbd6dbc52216e90d608 (diff)
debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch: Fix unit test hang that causes the build to fail sometimesdebian/0.11.93-2
-rw-r--r--debian/changelog6
-rw-r--r--debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch250
-rw-r--r--debian/patches/series1
3 files changed, 255 insertions, 2 deletions
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@debian.org> Thu, 09 Aug 2012 11:27:36 +0200
+ -- Sebastian Dröge <slomo@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@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