[evince] Wait until all jobs finish before exit



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]