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.
This commit is contained in:
Andoni Morales Alastruey 2010-10-22 14:01:26 +02:00 committed by Wim Taymans
parent 842911d241
commit 4a64969b3d

View file

@ -2323,10 +2323,34 @@ gst_multi_fd_sink_handle_clients (GstMultiFdSink * sink)
* - client socket input (ie, clients saying goodbye) * - client socket input (ie, clients saying goodbye)
* - client socket output (ie, client reads) */ * - client socket output (ie, client reads) */
GST_LOG_OBJECT (sink, "waiting on action on fdset"); 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 */ result = gst_poll_wait (sink->fdset, sink->timeout != 0 ? sink->timeout :
if (result < 0) { 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), GST_WARNING_OBJECT (sink, "wait failed: %s (%d)", g_strerror (errno),
errno); errno);
if (errno == EBADF) { if (errno == EBADF) {