[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