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 b99978f6..dca658fc 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 3804fc4c..d54ef030 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 4754adc5..7ce1942c 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 51cbbdf3..3314e718 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 ();