From d19d4dd4abe6ed48ec499a262fc0a485c814d34e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 16 Sep 2022 12:10:29 +0000 Subject: [PATCH] progressbar: Always finish properly Signed-off-by: Michael Tremer --- src/libpakfire/progressbar.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 98031667f..ed218d38b 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -127,7 +127,29 @@ static void pakfire_progressbar_free_widgets(struct pakfire_progressbar* p) { } } +static int __pakfire_progressbar_finish(struct pakfire_progressbar* p) { + int r; + int retval = 0; + + // Do nothing if already finished + if (p->status == PAKFIRE_PROGRESSBAR_FINISHED) + return 0; + + // Set status + p->status = PAKFIRE_PROGRESSBAR_FINISHED; + + // Wait until the render thread is done + r = pthread_join(p->renderer, (void**)&retval); + if (r) + return r; + + return retval; +} + static void pakfire_progressbar_free(struct pakfire_progressbar* p) { + // Ensure the progressbar has finished + __pakfire_progressbar_finish(p); + pakfire_progressbar_free_widgets(p); free(p); } @@ -339,21 +361,10 @@ PAKFIRE_EXPORT int pakfire_progressbar_increment(struct pakfire_progressbar* p, } PAKFIRE_EXPORT int pakfire_progressbar_finish(struct pakfire_progressbar* p) { - int r; - int retval = 0; - if (p->status != PAKFIRE_PROGRESSBAR_RUNNING) return EINVAL; - // Set status - p->status = PAKFIRE_PROGRESSBAR_FINISHED; - - // Wait until the render thread is done - r = pthread_join(p->renderer, (void**)&retval); - if (r) - return r; - - return retval; + return __pakfire_progressbar_finish(p); } PAKFIRE_EXPORT int pakfire_progressbar_reset(struct pakfire_progressbar* p) { -- 2.47.3