[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51739] trunk/blender/source/blender: Bugfix #33004
Ton Roosendaal
ton at blender.org
Mon Oct 29 18:41:20 CET 2012
Revision: 51739
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51739
Author: ton
Date: 2012-10-29 17:41:19 +0000 (Mon, 29 Oct 2012)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/blender.c
trunk/blender/source/blender/editors/render/render_internal.c
trunk/blender/source/blender/editors/render/render_opengl.c
trunk/blender/source/blender/windowmanager/WM_api.h
trunk/blender/source/blender/windowmanager/intern/wm_files.c
trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -485,7 +485,7 @@
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 */
Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/editors/render/render_internal.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -497,8 +497,8 @@
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) {
Modified: trunk/blender/source/blender/editors/render/render_opengl.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_opengl.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/editors/render/render_opengl.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -333,8 +333,8 @@
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;
Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2012-10-29 17:41:19 UTC (rev 51739)
@@ -357,8 +357,9 @@
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 */
Modified: trunk/blender/source/blender/windowmanager/intern/wm_files.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_files.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/windowmanager/intern/wm_files.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -144,7 +144,7 @@
/* 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) {
Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -372,7 +372,7 @@
if (C && wm) {
wmWindow *win;
- WM_jobs_stop_all(wm);
+ WM_jobs_kill_all(wm);
for (win = wm->windows.first; win; win = win->next) {
Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c 2012-10-29 16:27:09 UTC (rev 51738)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c 2012-10-29 17:41:19 UTC (rev 51739)
@@ -360,7 +360,7 @@
}
}
-/* 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 @@
}
-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 @@
}
+/* 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)
{
More information about the Bf-blender-cvs
mailing list