We do not want to stop a stream associated with gl_draw as a result of timeout because we may not get another opportunity to create a new stream if the current one gets stopped. However, when the stream does get stopped for other reasons, we need to clear the gl_draw_stream pointer associated with the relevant DC. v2: (suggestions from Frediano) - Don't stop the stream regardless of whether gl_draw is ongoing or not Cc: Frediano Ziglio <freddy77@xxxxxxxxx> Cc: Gerd Hoffmann <kraxel@xxxxxxxxxx> Cc: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> Cc: Dongwon Kim <dongwon.kim@xxxxxxxxx> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@xxxxxxxxx> Acked-by: Frediano Ziglio <freddy77@xxxxxxxxx> --- server/video-stream.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/video-stream.cpp b/server/video-stream.cpp index b62b2924..74cbb932 100644 --- a/server/video-stream.cpp +++ b/server/video-stream.cpp @@ -116,6 +116,10 @@ void video_stream_stop(DisplayChannel *display, VideoStream *stream) } dcc->pipe_add(video_stream_destroy_item_new(stream_agent)); video_stream_agent_stats_print(stream_agent); + + if (stream == display->priv->gl_draw_stream) { + display->priv->gl_draw_stream = nullptr; + } } display->priv->streams_size_total -= stream->width * stream->height; ring_remove(&stream->link); @@ -1042,7 +1046,8 @@ void video_stream_timeout(DisplayChannel *display) while (item) { VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link); item = ring_next(ring, item); - if (now >= (stream->last_time + RED_STREAM_TIMEOUT)) { + if (now >= (stream->last_time + RED_STREAM_TIMEOUT) && + stream != display->priv->gl_draw_stream) { detach_video_stream_gracefully(display, stream, nullptr); video_stream_stop(display, stream); } -- 2.43.0