From: Michael Tremer Date: Wed, 17 Aug 2022 08:52:19 +0000 (+0000) Subject: progressbar: Add mutex to avoid race when drawing X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9166251a0c1725d162b4edc9e0ab081811d7685f;p=people%2Fstevee%2Fpakfire.git progressbar: Add mutex to avoid race when drawing Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index c4681bf6..8338e6f6 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -19,6 +19,7 @@ #############################################################################*/ #include +#include #include #include #include @@ -75,6 +76,7 @@ struct pakfire_progressbar { struct timespec time_start; timer_t timer; + pthread_mutex_t drawlock; // Widgets STAILQ_HEAD(widgets, pakfire_progressbar_widget) widgets; @@ -134,12 +136,21 @@ static void pakfire_progressbar_free(struct pakfire_progressbar* p) { if (p->timer) timer_delete(p->timer); + // Free muted + pthread_mutex_destroy(&p->drawlock); + pakfire_progressbar_free_widgets(p); free(p); } static int pakfire_progressbar_draw(struct pakfire_progressbar* p) { struct pakfire_progressbar_widget* widget; + int r; + + // Acquire the lock + r = pthread_mutex_lock(&p->drawlock); + if (r) + return r; // Update terminal size if not set if (!terminal.cols) @@ -210,6 +221,9 @@ static int pakfire_progressbar_draw(struct pakfire_progressbar* p) { // Flush everything fflush(p->f); + // Release lock + pthread_mutex_unlock(&p->drawlock); + return 0; } @@ -222,6 +236,9 @@ static void __pakfire_progressbar_draw(union sigval data) { PAKFIRE_EXPORT int pakfire_progressbar_create( struct pakfire_progressbar** progressbar, FILE* f) { + int r; + + // Allocate main object struct pakfire_progressbar* p = calloc(1, sizeof(*p)); if (!p) return ENOMEM; @@ -236,6 +253,11 @@ PAKFIRE_EXPORT int pakfire_progressbar_create( // Store output p->f = stdout; + // Acquire lock + r = pthread_mutex_init(&p->drawlock, NULL); + if (r) + goto ERROR; + // Register signal handler to update terminal size signal(SIGWINCH, pakfire_progressbar_update_terminal_size); @@ -251,7 +273,7 @@ PAKFIRE_EXPORT int pakfire_progressbar_create( }; // Create timer - int r = timer_create(CLOCK_REALTIME, &sigevent, &p->timer); + r = timer_create(CLOCK_REALTIME, &sigevent, &p->timer); if (r) goto ERROR;