From 88c80105642f9dad61d4cd013d745c0c46d1ba39 Mon Sep 17 00:00:00 2001 From: Marek Kasik Date: Mon, 23 May 2022 14:55:09 +0200 Subject: [PATCH] Wait until all jobs finish before exit Wait for all jobs before exiting main(). This allows clean execution of exit handlers. Otherwise, the threads which executes the jobs could access data already cleaned by exit handlers. Fixes #1713 --- libview/ev-job-scheduler.c | 17 +++++++++++++++++ libview/ev-job-scheduler.h | 3 +++ previewer/ev-previewer.c | 1 + shell/main.c | 1 + 4 files changed, 22 insertions(+) diff --git a/libview/ev-job-scheduler.c b/libview/ev-job-scheduler.c index b99978f67..dca658fc8 100644 --- a/libview/ev-job-scheduler.c +++ b/libview/ev-job-scheduler.c @@ -317,3 +317,20 @@ ev_job_scheduler_get_running_thread_job (void) { return g_atomic_pointer_get (&running_job); } + +/** + * ev_job_scheduler_wait: + * + * Synchronously waits until all jobs are done. + * Remember that main loop is not running already probably. + */ +void +ev_job_scheduler_wait (void) +{ + ev_debug_message (DEBUG_JOBS, "Waiting for empty job list"); + + while (job_list != NULL) + g_usleep (100); + + ev_debug_message (DEBUG_JOBS, "Job list is empty"); +} diff --git a/libview/ev-job-scheduler.h b/libview/ev-job-scheduler.h index 3804fc4c1..d54ef0300 100644 --- a/libview/ev-job-scheduler.h +++ b/libview/ev-job-scheduler.h @@ -48,4 +48,7 @@ void ev_job_scheduler_update_job (EvJob *job, EV_PUBLIC EvJob *ev_job_scheduler_get_running_thread_job (void); +EV_PUBLIC +void ev_job_scheduler_wait (void); + G_END_DECLS diff --git a/previewer/ev-previewer.c b/previewer/ev-previewer.c index 4754adc5b..7ce1942c2 100644 --- a/previewer/ev-previewer.c +++ b/previewer/ev-previewer.c @@ -331,6 +331,7 @@ main (gint argc, gchar **argv) if (print_settings_file) ev_previewer_unlink_tempfile (print_settings_file); + ev_job_scheduler_wait (); ev_shutdown (); ev_stock_icons_shutdown (); diff --git a/shell/main.c b/shell/main.c index 51cbbdf3a..3314e718e 100644 --- a/shell/main.c +++ b/shell/main.c @@ -318,6 +318,7 @@ main (int argc, char *argv[]) status = g_application_run (G_APPLICATION (application), 0, NULL); done: + ev_job_scheduler_wait (); ev_shutdown (); ev_stock_icons_shutdown (); -- GitLab