From: Carlos Garcia Campos Date: Sat, 4 Dec 2010 14:41:35 +0000 (+0100) Subject: libview: add a method to get the job currently running in the worker thread X-Git-Tag: EVINCE_2_91_4~58 X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=23e76eac47c60ab885edcdb6a337ee7587afa7e8;p=evince.git libview: add a method to get the job currently running in the worker thread When a job is cancelled while it's running, the cancelled signal might be emitted before the job finishes, and since the finished signal is not emitted for cancelled jobs, it's not possible to know when the job has finished. With this method we can see whether the job is still running and wait until it finishes. --- diff --git a/libview/ev-job-scheduler.c b/libview/ev-job-scheduler.c index 2537c321..85e5adda 100644 --- a/libview/ev-job-scheduler.c +++ b/libview/ev-job-scheduler.c @@ -30,6 +30,8 @@ typedef struct _EvSchedulerJob { G_LOCK_DEFINE_STATIC(job_list); static GSList *job_list = NULL; +static volatile EvJob *running_job = NULL; + static gpointer ev_job_thread_proxy (gpointer data); static void ev_scheduler_thread_job_cancelled (EvSchedulerJob *job, GCancellable *cancellable); @@ -179,9 +181,13 @@ ev_job_thread (EvJob *job) do { if (g_cancellable_is_cancelled (job->cancellable)) result = FALSE; - else + else { + g_atomic_pointer_set (&running_job, job); result = ev_job_run (job); + } } while (result); + + g_atomic_pointer_set (&running_job, NULL); } static gboolean @@ -303,3 +309,8 @@ ev_job_scheduler_update_job (EvJob *job, } } +EvJob * +ev_job_scheduler_get_running_thread_job (void) +{ + return g_atomic_pointer_get (&running_job); +} diff --git a/libview/ev-job-scheduler.h b/libview/ev-job-scheduler.h index 9c7a0d83..0e08b96c 100644 --- a/libview/ev-job-scheduler.h +++ b/libview/ev-job-scheduler.h @@ -38,10 +38,11 @@ typedef enum { EV_JOB_N_PRIORITIES } EvJobPriority; -void ev_job_scheduler_push_job (EvJob *job, - EvJobPriority priority); -void ev_job_scheduler_update_job (EvJob *job, - EvJobPriority priority); +void ev_job_scheduler_push_job (EvJob *job, + EvJobPriority priority); +void ev_job_scheduler_update_job (EvJob *job, + EvJobPriority priority); +EvJob *ev_job_scheduler_get_running_thread_job (void); G_END_DECLS