diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_jobs.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 54 |
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); |