[evince] Wait until all jobs finish before exit
- From: Germán Poo-Caamaño <gpoo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] Wait until all jobs finish before exit
- Date: Fri, 15 Jul 2022 19:37:10 +0000 (UTC)
commit 88c80105642f9dad61d4cd013d745c0c46d1ba39
Author: Marek Kasik <mkasik redhat com>
Date: Mon May 23 14:55:09 2022 +0200
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 ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]