diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-08-10 13:00:31 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-08-10 13:00:31 +0200 |
commit | 427ff61c5eb4e91087d7c1df17f4cfd20dbc36a1 (patch) | |
tree | 072bbdd30494b329d87c99b37c3415d0afd135b1 | |
parent | 30fd492292b47d1e0fb69fbd6dbc52216e90d608 (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/changelog | 6 | ||||
-rw-r--r-- | debian/patches/0001-netclientclock-simplify-by-using-g_socket_condition_.patch | 250 | ||||
-rw-r--r-- | debian/patches/series | 1 |
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 |