diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_jobs.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 6dd150a3416..0fd658dbb64 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -252,29 +252,38 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) } } +/* stop job, free data completely */ +static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve) +{ + if(steve->running) { + /* signal job to end */ + steve->stop= 1; + BLI_end_threads(&steve->threads); + } + + if(steve->wt) + WM_event_remove_window_timer(steve->win, steve->wt); + if(steve->customdata) + steve->free(steve->customdata); + if(steve->run_customdata) + steve->run_free(steve->run_customdata); + + /* remove steve */ + BLI_remlink(&wm->jobs, steve); + MEM_freeN(steve); + +} + void WM_jobs_stop_all(wmWindowManager *wm) { - wmJob *steve= wm->jobs.first; + wmJob *steve; - for(; steve; steve= steve->next) { - if(steve->running) { - /* signal job to end */ - steve->stop= 1; - BLI_end_threads(&steve->threads); - } - - if(steve->wt) - WM_event_remove_window_timer(steve->win, steve->wt); - if(steve->customdata) - steve->free(steve->customdata); - if(steve->run_customdata) - steve->run_free(steve->run_customdata); - } + while((steve= wm->jobs.first)) + wm_jobs_kill_job(wm, steve); - BLI_freelistN(&wm->jobs); } -/* stops job(s) from this owner */ +/* signal job(s) from this owner to stop, timer is required to get handled */ void WM_jobs_stop(wmWindowManager *wm, void *owner) { wmJob *steve; @@ -285,6 +294,19 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner) steve->stop= 1; } +/* kill job entirely, also removes timer itself */ +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) { + if(steve->wt==wt) { + wm_jobs_kill_job(wm, steve); + return; + } + } +} + /* hardcoded to event TIMERJOBS */ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt) { |