From 0272e6dc772664bdbad21eab5c28919e63102bdd Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 11 Apr 2021 15:01:05 +0200 Subject: [PATCH] Assert screen closed on destroy The destruction order is important, but tricky, because the screen is open/close by the decoder, but destroyed by scrcpy.c on the main thread. Add assertions to guarantee that the screen is not destroyed before being closed. --- app/src/screen.c | 13 +++++++++++++ app/src/screen.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/app/src/screen.c b/app/src/screen.c index ddf81b08..1b3c5179 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -247,6 +247,9 @@ static bool screen_frame_sink_open(struct sc_frame_sink *sink) { struct screen *screen = DOWNCAST(sink); (void) screen; +#ifndef NDEBUG + screen->open = true; +#endif // nothing to do, the screen is already open on the main thread return true; @@ -256,6 +259,9 @@ static void screen_frame_sink_close(struct sc_frame_sink *sink) { struct screen *screen = DOWNCAST(sink); (void) screen; +#ifndef NDEBUG + screen->open = false; +#endif // nothing to do, the screen lifecycle is not managed by the frame producer } @@ -435,6 +441,10 @@ screen_init(struct screen *screen, struct fps_counter *fps_counter, screen->frame_sink.ops = &ops; +#ifndef NDEBUG + screen->open = false; +#endif + return true; } @@ -445,6 +455,9 @@ screen_show_window(struct screen *screen) { void screen_destroy(struct screen *screen) { +#ifndef NDEBUG + assert(!screen->open); +#endif av_frame_free(&screen->frame); SDL_DestroyTexture(screen->texture); SDL_DestroyRenderer(screen->renderer); diff --git a/app/src/screen.h b/app/src/screen.h index 3b4506e3..4a0bad09 100644 --- a/app/src/screen.h +++ b/app/src/screen.h @@ -15,6 +15,10 @@ struct screen { struct sc_frame_sink frame_sink; // frame sink trait +#ifndef NDEBUG + bool open; // track the open/close state to assert correct behavior +#endif + struct video_buffer vb; struct fps_counter *fps_counter;