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:
authorTon Roosendaal <ton@blender.org>2012-10-29 21:41:19 +0400
committerTon Roosendaal <ton@blender.org>2012-10-29 21:41:19 +0400
commit9efdd09578f1aa2c3e860d7d57022f64ab9c3fb5 (patch)
treeafa1fd2b12afd8f7e4fc51f732d08bb3f43376f5 /source/blender/windowmanager/intern/wm_jobs.c
parentf139377a1a096582e5a7367696f307b1de7b8026 (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.c17
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)
{