mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
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:
parent
842911d241
commit
4a64969b3d
1 changed files with 27 additions and 3 deletions
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue