From 4a64969b3d6ee57fad6bbadcbc94a962e2d08046 Mon Sep 17 00:00:00 2001 From: Andoni Morales Alastruey Date: Fri, 22 Oct 2010 14:01:26 +0200 Subject: [PATCH] multifdsink: disconnect inactive clients in the select loop too Clients are usually disconnected in the streaming thread if their inactivity is bigger than the timeout. If no new buffers are to be rendered in the sink, these clients will never be disconnected and for that reason it should be handled in the select() loop too. --- gst/tcp/gstmultifdsink.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/gst/tcp/gstmultifdsink.c b/gst/tcp/gstmultifdsink.c index 9532c83e38..0a513d788a 100644 --- a/gst/tcp/gstmultifdsink.c +++ b/gst/tcp/gstmultifdsink.c @@ -2323,10 +2323,34 @@ gst_multi_fd_sink_handle_clients (GstMultiFdSink * sink) * - client socket input (ie, clients saying goodbye) * - client socket output (ie, client reads) */ GST_LOG_OBJECT (sink, "waiting on action on fdset"); - result = gst_poll_wait (sink->fdset, GST_CLOCK_TIME_NONE); - /* < 0 is an error, 0 just means a timeout happened, which is impossible */ - if (result < 0) { + result = gst_poll_wait (sink->fdset, sink->timeout != 0 ? sink->timeout : + GST_CLOCK_TIME_NONE); + + /* Handle the special case in which the sink is not receiving more buffers + * and will not disconnect innactive client in the streaming thread. */ + if (G_UNLIKELY (result == 0)) { + GstClockTime now; + GTimeVal nowtv; + + g_get_current_time (&nowtv); + now = GST_TIMEVAL_TO_TIME (nowtv); + + CLIENTS_LOCK (sink); + for (clients = sink->clients; clients; clients = next) { + GstTCPClient *client; + + client = (GstTCPClient *) clients->data; + next = g_list_next (clients); + if (sink->timeout > 0 + && now - client->last_activity_time > sink->timeout) { + client->status = GST_CLIENT_STATUS_SLOW; + gst_multi_fd_sink_remove_client_link (sink, clients); + } + } + CLIENTS_UNLOCK (sink); + return; + } else if (result < 0) { GST_WARNING_OBJECT (sink, "wait failed: %s (%d)", g_strerror (errno), errno); if (errno == EBADF) {