Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/windowmanager/intern/wm_jobs.c')
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c54
1 files changed, 31 insertions, 23 deletions
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index f8258d18c1a..5580d3217a5 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -103,7 +103,7 @@ struct wmJob {
unsigned int note, endnote;
-/* internal */
+ /* internal */
void *owner;
int flag;
short suspended, running, ready, do_update, stop, job_type;
@@ -111,7 +111,7 @@ struct wmJob {
/* for display in header, identification */
char name[128];
-
+
/* once running, we store this separately */
void *run_customdata;
void (*run_free)(void *);
@@ -124,7 +124,6 @@ struct wmJob {
/* ticket mutex for main thread locking while some job accesses
* data that the main thread might modify at the same time */
TicketMutex *main_thread_mutex;
- bool main_thread_mutex_ending;
};
/* Main thread locking */
@@ -132,25 +131,15 @@ struct wmJob {
void WM_job_main_thread_lock_acquire(wmJob *wm_job)
{
BLI_ticket_mutex_lock(wm_job->main_thread_mutex);
-
- /* if BLI_end_threads is being called to stop the job before it's finished,
- * we no longer need to lock to get access to the main thread as it's
- * waiting and can't respond */
- if (wm_job->main_thread_mutex_ending)
- BLI_ticket_mutex_unlock(wm_job->main_thread_mutex);
}
void WM_job_main_thread_lock_release(wmJob *wm_job)
{
- if (!wm_job->main_thread_mutex_ending)
- BLI_ticket_mutex_unlock(wm_job->main_thread_mutex);
+ BLI_ticket_mutex_unlock(wm_job->main_thread_mutex);
}
-static void wm_job_main_thread_yield(wmJob *wm_job, bool ending)
+static void wm_job_main_thread_yield(wmJob *wm_job)
{
- if (ending)
- wm_job->main_thread_mutex_ending = true;
-
/* unlock and lock the ticket mutex. because it's a fair mutex any job that
* is waiting to acquire the lock will get it first, before we can lock */
BLI_ticket_mutex_unlock(wm_job->main_thread_mutex);
@@ -206,7 +195,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *
BLI_strncpy(wm_job->name, name, sizeof(wm_job->name));
wm_job->main_thread_mutex = BLI_ticket_mutex_alloc();
- BLI_ticket_mutex_lock(wm_job->main_thread_mutex);
+ WM_job_main_thread_lock_acquire(wm_job);
}
/* else: a running job, be careful */
@@ -245,6 +234,17 @@ float WM_jobs_progress(wmWindowManager *wm, void *owner)
return 0.0;
}
+/* time that job started */
+double WM_jobs_starttime(wmWindowManager *wm, void *owner)
+{
+ wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
+
+ if (wm_job && wm_job->flag & WM_JOB_PROGRESS)
+ return wm_job->start_time;
+
+ return 0;
+}
+
char *WM_jobs_name(wmWindowManager *wm, void *owner)
{
wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
@@ -280,6 +280,12 @@ bool WM_jobs_is_running(wmJob *wm_job)
return wm_job->running;
}
+bool WM_jobs_is_stopped(wmWindowManager *wm, void *owner)
+{
+ wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
+ return wm_job ? wm_job->stop : true; /* XXX to be redesigned properly. */
+}
+
void *WM_jobs_customdata_get(wmJob *wm_job)
{
if (!wm_job->customdata) {
@@ -420,8 +426,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
if (wm_job->wt == NULL)
wm_job->wt = WM_event_add_timer(wm, wm_job->win, TIMERJOBS, wm_job->timestep);
- if (G.debug & G_DEBUG_JOBS)
- wm_job->start_time = PIL_check_seconds_timer();
+ wm_job->start_time = PIL_check_seconds_timer();
}
else {
printf("job fails, not initialized\n");
@@ -432,7 +437,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
static void wm_job_free(wmWindowManager *wm, wmJob *wm_job)
{
BLI_remlink(&wm->jobs, wm_job);
- BLI_ticket_mutex_unlock(wm_job->main_thread_mutex);
+ WM_job_main_thread_lock_release(wm_job);
BLI_ticket_mutex_free(wm_job->main_thread_mutex);
MEM_freeN(wm_job);
}
@@ -443,8 +448,10 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job)
if (wm_job->running) {
/* signal job to end */
wm_job->stop = true;
- wm_job_main_thread_yield(wm_job, true);
+
+ WM_job_main_thread_lock_release(wm_job);
BLI_end_threads(&wm_job->threads);
+ WM_job_main_thread_lock_acquire(wm_job);
if (wm_job->endjob)
wm_job->endjob(wm_job->run_customdata);
@@ -560,7 +567,7 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
if (wm_job->threads.first) {
/* let threads get temporary lock over main thread if needed */
- wm_job_main_thread_yield(wm_job, false);
+ wm_job_main_thread_yield(wm_job);
/* always call note and update when ready */
if (wm_job->do_update || wm_job->ready) {
@@ -592,9 +599,10 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
}
wm_job->running = false;
- wm_job_main_thread_yield(wm_job, true);
+
+ WM_job_main_thread_lock_release(wm_job);
BLI_end_threads(&wm_job->threads);
- wm_job->main_thread_mutex_ending = false;
+ WM_job_main_thread_lock_acquire(wm_job);
if (wm_job->endnote)
WM_event_add_notifier(C, wm_job->endnote, NULL);