[evince] libview: add a method to get the job currently running in the worker thread



commit 23e76eac47c60ab885edcdb6a337ee7587afa7e8
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sat Dec 4 15:41:35 2010 +0100

    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.

 libview/ev-job-scheduler.c |   13 ++++++++++++-
 libview/ev-job-scheduler.h |    9 +++++----
 2 files changed, 17 insertions(+), 5 deletions(-)
---
diff --git a/libview/ev-job-scheduler.c b/libview/ev-job-scheduler.c
index 2537c32..85e5add 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 9c7a0d8..0e08b96 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
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]