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.c56
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)
{