[Spice-devel] [PATCH v1 5/5] video-stream: Don't stop a stream if a gl_draw operation is pending
Frediano Ziglio
freddy77 at gmail.com
Fri Apr 21 19:00:10 UTC 2023
Il giorno gio 16 mar 2023 alle ore 06:05 Vivek Kasireddy
<vivek.kasireddy at intel.com> ha scritto:
>
> Before stopping a stream, we need to ensure that there is no ongoing
> gl_draw operation; otherwise, we may not get another opportunity to
> create a new stream if the current one gets stopped. And, once the
> stream is stopped, we need to clear the gl_draw_stream pointer
> associated with the relevant client (dcc).
>
> Cc: Gerd Hoffmann <kraxel at redhat.com>
> Cc: Marc-André Lureau <marcandre.lureau at redhat.com>
> Cc: Dongwon Kim <dongwon.kim at intel.com>
> Signed-off-by: Vivek Kasireddy <vivek.kasireddy at intel.com>
> ---
> server/video-stream.cpp | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/server/video-stream.cpp b/server/video-stream.cpp
> index 03a7d68d..b7f3d2c5 100644
> --- a/server/video-stream.cpp
> +++ b/server/video-stream.cpp
> @@ -18,6 +18,7 @@
>
> #include "video-stream.h"
> #include "display-channel-private.h"
> +#include "dcc-private.h"
This smells bad from design, it loose the "private" meaning.
> #include "main-channel-client.h"
> #include "red-client.h"
>
> @@ -115,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 == dcc->priv->gl_draw_stream) {
> + dcc->priv->gl_draw_stream = nullptr;
It looks like a "weak" pointer. Why is that? Maybe the bound between
stream and time expiration? Maybe for that specific stream time
expiration does not make much sense?
> + }
> }
> display->priv->streams_size_total -= stream->width * stream->height;
> ring_remove(&stream->link);
> @@ -974,6 +979,19 @@ void video_stream_detach_and_stop(DisplayChannel *display)
> }
> }
>
> +static bool is_stream_gl_draw(VideoStream *stream, DisplayChannel *display)
> +{
> + DisplayChannelClient *dcc;
> +
> + FOREACH_DCC(display, dcc) {
> + if (stream == dcc->priv->gl_draw_stream &&
> + dcc->priv->gl_draw_ongoing) {
> + return TRUE;
Minor: true
> + }
> + }
> + return FALSE;
Minor: false
Maybe use a boolean flag in VideoStream instead ?
> +}
> +
> void video_stream_timeout(DisplayChannel *display)
> {
> Ring *ring = &display->priv->streams;
> @@ -984,7 +1002,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) &&
> + !is_stream_gl_draw(stream, display)) {
> detach_video_stream_gracefully(display, stream, nullptr);
> video_stream_stop(display, stream);
> }
Frediano
More information about the Spice-devel
mailing list