diff options
author | Ton Roosendaal <ton@blender.org> | 2012-10-29 21:41:19 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2012-10-29 21:41:19 +0400 |
commit | 9efdd09578f1aa2c3e860d7d57022f64ab9c3fb5 (patch) | |
tree | afa1fd2b12afd8f7e4fc51f732d08bb3f43376f5 /source/blender/windowmanager/intern/wm_jobs.c | |
parent | f139377a1a096582e5a7367696f307b1de7b8026 (diff) |
Bugfix #33004
Screencast recording stopped on a undo/redo. This was because all thread jobs
were killed then. Now it leaves screen jobs (screen cast) running, that's
data that doesn't change on undos.
Also renamed jobs_stop_all() to jobs_kill_all() - it terminates threads.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_jobs.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 0917d766051..42d721327b6 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -360,7 +360,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) } } -/* stop job, free data completely */ +/* stop job, end thread, free data completely */ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job) { if (wm_job->running) { @@ -385,7 +385,8 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job) } -void WM_jobs_stop_all(wmWindowManager *wm) +/* wait until every job ended */ +void WM_jobs_kill_all(wmWindowManager *wm) { wmJob *wm_job; @@ -394,6 +395,18 @@ void WM_jobs_stop_all(wmWindowManager *wm) } +/* wait until every job ended, except for one owner (used in undo to keep screen job alive) */ +void WM_jobs_kill_all_except(wmWindowManager *wm, void *owner) +{ + wmJob *wm_job; + + for (wm_job = wm->jobs.first; wm_job; wm_job = wm_job->next) { + if (wm_job->owner != owner) + wm_jobs_kill_job(wm, wm_job); + } +} + + /* signal job(s) from this owner or callback to stop, timer is required to get handled */ void WM_jobs_stop(wmWindowManager *wm, void *owner, void *startjob) { |