[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42257] trunk/blender/source/blender: Fix #27328: Undoing an operation while baking fluids freezes Blender

Sergey Sharybin sergey.vfx at gmail.com
Tue Nov 29 16:26:53 CET 2011


Revision: 42257
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42257
Author:   nazgul
Date:     2011-11-29 15:26:46 +0000 (Tue, 29 Nov 2011)
Log Message:
-----------
Fix #27328: Undoing an operation while baking fluids freezes Blender

Prevent Undo be run if there are any jobs are currently running.
This also makes sense with such jobs as multires baker, for example.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/util/undo.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2011-11-29 14:49:47 UTC (rev 42256)
+++ trunk/blender/source/blender/editors/util/undo.c	2011-11-29 15:26:46 UTC (rev 42257)
@@ -125,6 +125,12 @@
 	Object *obact= CTX_data_active_object(C);
 	ScrArea *sa= CTX_wm_area(C);
 
+	/* undo during jobs are running can easily lead to freeing data using by jobs,
+	    or they can just lead to freezing job in some other cases */
+	if(WM_jobs_has_running(CTX_wm_manager(C))) {
+		return OPERATOR_CANCELLED;
+	}
+
 	/* grease pencil can be can be used in plenty of spaces, so check it first */
 	if(ED_gpencil_session_active()) {
 		return ED_undo_gpencil_step(C, step, undoname);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2011-11-29 14:49:47 UTC (rev 42256)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2011-11-29 15:26:46 UTC (rev 42257)
@@ -316,6 +316,8 @@
 void		WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *));
 void		WM_jobs_stop_all(struct wmWindowManager *wm);
 
+int			WM_jobs_has_running(struct wmWindowManager *wm);
+
 			/* clipboard */
 char		*WM_clipboard_text_get(int selection);
 void		WM_clipboard_text_set(char *buf, int selection);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2011-11-29 14:49:47 UTC (rev 42256)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2011-11-29 15:26:46 UTC (rev 42257)
@@ -505,3 +505,13 @@
 	}
 }
 
+int WM_jobs_has_running(wmWindowManager *wm)
+{
+	wmJob *steve;
+
+	for(steve= wm->jobs.first; steve; steve= steve->next)
+		if(steve->running)
+			return 1;
+
+	return 0;
+}




More information about the Bf-blender-cvs mailing list