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 | |
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.
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 4 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 17 |
7 files changed, 25 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index c6fa2de6545..e1e868b234e 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -485,7 +485,7 @@ static int read_undosave(bContext *C, UndoElem *uel) int success = 0, fileflags; /* This is needed so undoing/redoing doesn't crash with threaded previews going */ - WM_jobs_stop_all(CTX_wm_manager(C)); + WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C)); BLI_strncpy(mainstr, G.main->name, sizeof(mainstr)); /* temporal store */ diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index ad9b082d044..fe802abc3a9 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -497,8 +497,8 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } - /* stop all running jobs, currently previews frustrate Render */ - WM_jobs_stop_all(CTX_wm_manager(C)); + /* stop all running jobs, except screen one. currently previews frustrate Render */ + WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C)); /* get main */ if (G.debug_value == 101) { diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 0b6b5cb8e4a..e4592a4f77e 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -333,8 +333,8 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op) return 0; } - /* stop all running jobs, currently previews frustrate Render */ - WM_jobs_stop_all(CTX_wm_manager(C)); + /* stop all running jobs, except screen one. currently previews frustrate Render */ + WM_jobs_kill_all_except(CTX_wm_manager(C), CTX_wm_screen(C)); /* create offscreen buffer */ sizex = (scene->r.size * scene->r.xsch) / 100; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index e7b7f679ce3..04e8b65a2ef 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -357,8 +357,9 @@ void WM_jobs_callbacks(struct wmJob *, void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *); void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob); void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *)); -void WM_jobs_stop_all(struct wmWindowManager *wm); - +void WM_jobs_kill_all(struct wmWindowManager *wm); + void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner); + int WM_jobs_has_running(struct wmWindowManager *wm); /* clipboard */ diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index bb8c434dfb5..6124b03778d 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -144,7 +144,7 @@ static void wm_window_match_init(bContext *C, ListBase *wmlist) /* code copied from wm_init_exit.c */ for (wm = wmlist->first; wm; wm = wm->id.next) { - WM_jobs_stop_all(wm); + WM_jobs_kill_all(wm); for (win = wm->windows.first; win; win = win->next) { diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 89fa92b7373..6d4a84d7896 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -372,7 +372,7 @@ void WM_exit_ext(bContext *C, const short do_python) if (C && wm) { wmWindow *win; - WM_jobs_stop_all(wm); + WM_jobs_kill_all(wm); for (win = wm->windows.first; win; win = win->next) { 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) { |