[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29945] trunk/blender/source/blender: Fix #21062 and #22175: crash with node previews being calculated while

Brecht Van Lommel brecht at blender.org
Sun Jul 4 21:58:52 CEST 2010


Revision: 29945
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29945
Author:   blendix
Date:     2010-07-04 21:58:52 +0200 (Sun, 04 Jul 2010)

Log Message:
-----------
Fix #21062 and #22175: crash with node previews being calculated while
editing nodes. Now preview jobs are killed before making any node edits.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_render.h
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/editors/space_file/filelist.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c

Modified: trunk/blender/source/blender/editors/include/ED_render.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_render.h	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/editors/include/ED_render.h	2010-07-04 19:58:52 UTC (rev 29945)
@@ -78,6 +78,7 @@
 
 void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID *id, struct ID *parent, struct MTex *slot, int sizex, int sizey, int method);
 void ED_preview_icon_job(const struct bContext *C, void *owner, struct ID *id, unsigned int *rect, int sizex, int sizey);
+void ED_preview_kill_jobs(const struct bContext *C);
 
 void ED_preview_draw(const struct bContext *C, void *idp, void *parentp, void *slot, rcti *rect);
 

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2010-07-04 19:58:52 UTC (rev 29945)
@@ -952,7 +952,6 @@
 	uiLayout *result= NULL, *col, *col1, *col2, *box, *row, *subrow, *split;
 	PointerRNA ptr;
 	char typestr[32];
-	short width = 265;
 	short proxy_protected, xco=0, yco=0;
 	int rb_col;
 
@@ -2444,13 +2443,13 @@
 			G.afbreek= 1;
 			break;
 		case B_STOPCAST:
-			WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
+			WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C), NULL);
 			break;
 		case B_STOPANIM:
 			WM_operator_name_call(C, "SCREEN_OT_animation_play", WM_OP_INVOKE_SCREEN, NULL);
 			break;
 		case B_STOPCOMPO:
-			WM_jobs_stop(CTX_wm_manager(C), CTX_wm_area(C));
+			WM_jobs_stop(CTX_wm_manager(C), CTX_wm_area(C), NULL);
 			break;
 	}
 }

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2010-07-04 19:58:52 UTC (rev 29945)
@@ -1153,4 +1153,10 @@
 	WM_jobs_start(CTX_wm_manager(C), steve);
 }
 
+void ED_preview_kill_jobs(const struct bContext *C)
+{
+	wmWindowManager *wm= CTX_wm_manager(C);
+	if(wm)
+		WM_jobs_kill(wm, NULL, common_preview_startjob);
+}
 

Modified: trunk/blender/source/blender/editors/space_file/filelist.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/filelist.c	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/editors/space_file/filelist.c	2010-07-04 19:58:52 UTC (rev 29945)
@@ -1360,7 +1360,7 @@
 
 void thumbnails_stop(struct FileList* filelist, const struct bContext* C)
 {
-	WM_jobs_kill(CTX_wm_manager(C), filelist);
+	WM_jobs_kill(CTX_wm_manager(C), filelist, NULL);
 }
 
 int thumbnails_running(struct FileList* filelist, const struct bContext* C)

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2010-07-04 19:58:52 UTC (rev 29945)
@@ -66,6 +66,7 @@
 
 #include "ED_node.h"
 #include "ED_screen.h"
+#include "ED_render.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -549,6 +550,8 @@
 	SpaceNode *snode = CTX_wm_space_node(C);
 	bNode *gnode;
 
+	ED_preview_kill_jobs(C);
+
 	gnode= nodeGetActive(snode->edittree);
 	snode_make_group_editable(snode, gnode);
 
@@ -594,6 +597,8 @@
 	SpaceNode *snode = CTX_wm_space_node(C);
 	bNode *gnode;
 
+	ED_preview_kill_jobs(C);
+
 	/* are we inside of a group? */
 	gnode= node_tree_get_editgroup(snode->nodetree);
 	if(gnode)
@@ -1099,13 +1104,16 @@
 	SpaceNode *snode= CTX_wm_space_node(C);
 	bNode *node;
 	
-	
 	node= editnode_get_active(snode->edittree);
 	
-	if(node) {
-		node_link_viewer(snode, node);
-		snode_notify(C, snode);
-	}
+	if(!node)
+		return OPERATOR_CANCELLED;
+
+	ED_preview_kill_jobs(C);
+
+	node_link_viewer(snode, node);
+	snode_notify(C, snode);
+
 	return OPERATOR_FINISHED;
 }
 
@@ -1467,6 +1475,8 @@
 {
 	SpaceNode *snode= CTX_wm_space_node(C);
 	
+	ED_preview_kill_jobs(C);
+
 	ntreeCopyTree(snode->edittree, 1);	/* 1 == internally selected nodes */
 	
 	ntreeSolveOrder(snode->edittree);
@@ -1625,7 +1635,7 @@
 static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag)
 {
 	bNodeLink *link;
-	
+
 	/* output indicated? */
 	if(find_indicated_socket(snode, &nldrag->node, &nldrag->sock, SOCK_OUT)) {
 		if(nodeCountSocketLinks(snode->edittree, nldrag->sock) < nldrag->sock->limit)
@@ -1679,6 +1689,8 @@
 	UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, 
 							 &snode->mx, &snode->my);
 
+	ED_preview_kill_jobs(C);
+
 	nldrag->in_out= node_link_init(snode, nldrag);
 		
 	if(nldrag->in_out) {
@@ -1725,6 +1737,8 @@
 	SpaceNode *snode= CTX_wm_space_node(C);
 	int replace = RNA_boolean_get(op->ptr, "replace");
 
+	ED_preview_kill_jobs(C);
+
 	snode_autoconnect(snode, 0, replace);
 
 	node_tree_verify_groups(snode->nodetree);
@@ -1788,6 +1802,8 @@
 	
 	if(i>1) {
 		bNodeLink *link, *next;
+
+		ED_preview_kill_jobs(C);
 		
 		for(link= snode->edittree->links.first; link; link= next) {
 			next= link->next;
@@ -1840,6 +1856,8 @@
 	Scene *curscene= CTX_data_scene(C), *scene;
 	bNode *node;
 
+	ED_preview_kill_jobs(C);
+
 	/* first tag scenes unread */
 	for(scene= G.main->scene.first; scene; scene= scene->id.next) 
 		scene->id.flag |= LIB_DOIT;
@@ -1956,6 +1974,8 @@
 			return OPERATOR_CANCELLED;
 		}
 	}
+
+	ED_preview_kill_jobs(C);
 	
 	gnode= nodeMakeGroupFromSelected(snode->nodetree);
 	if(gnode==NULL) {
@@ -2058,6 +2078,8 @@
 	if((snode == NULL) || (snode->edittree == NULL))
 		return OPERATOR_CANCELLED;
 
+	ED_preview_kill_jobs(C);
+
 	node_flag_toggle_exec(snode, NODE_PREVIEW);
 
 	snode_notify(C, snode);
@@ -2090,6 +2112,8 @@
 	if((snode == NULL) || (snode->edittree == NULL))
 		return OPERATOR_CANCELLED;
 
+	ED_preview_kill_jobs(C);
+
 	for(node= snode->edittree->nodes.first; node; node= node->next) {
 		if(node->flag & SELECT) {
 			if(node_has_hidden_sockets(node)) {
@@ -2138,6 +2162,8 @@
 	if(node_tree_get_editgroup(snode->nodetree))
 		return OPERATOR_CANCELLED;
 	
+	ED_preview_kill_jobs(C);
+
 	for(node= snode->edittree->nodes.first; node; node= node->next) {
 		if(node->flag & SELECT) {
 			if(node->inputs.first && node->outputs.first) {
@@ -2174,6 +2200,8 @@
 	SpaceNode *snode= CTX_wm_space_node(C);
 	bNode *node, *next;
 	
+	ED_preview_kill_jobs(C);
+
 	for(node= snode->edittree->nodes.first; node; node= next) {
 		next= node->next;
 		if(node->flag & SELECT) {
@@ -2275,6 +2303,8 @@
 	
 	if (snode->nodetree->type==NTREE_COMPOSIT)
 		ntype = CMP_NODE_IMAGE;
+
+	ED_preview_kill_jobs(C);
 	
 	node = node_add_node(snode, scene, ntype, snode->mx, snode->my);
 	

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2010-07-04 19:58:52 UTC (rev 29945)
@@ -325,8 +325,8 @@
 							  void (*endjob)(void *));
 
 void		WM_jobs_start(struct wmWindowManager *wm, struct wmJob *);
-void		WM_jobs_stop(struct wmWindowManager *wm, void *owner);
-void		WM_jobs_kill(struct wmWindowManager *wm, void *owner);
+void		WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob);
+void		WM_jobs_kill(struct wmWindowManager *wm, void *owner, void *startjob);
 void		WM_jobs_stop_all(struct wmWindowManager *wm);
 
 			/* clipboard */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2010-07-04 18:40:59 UTC (rev 29944)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2010-07-04 19:58:52 UTC (rev 29945)
@@ -339,28 +339,25 @@
 	
 }
 
-/* signal job(s) from this owner to stop, timer is required to get handled */
-void WM_jobs_stop(wmWindowManager *wm, void *owner)
+/* 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)
 {
 	wmJob *steve;
 	
 	for(steve= wm->jobs.first; steve; steve= steve->next)
-		if(steve->owner==owner)
+		if(steve->owner==owner || steve->startjob==startjob)
 			if(steve->running)
 				steve->stop= 1;
 }
 
 /* actually terminate thread and job timer */
-void WM_jobs_kill(wmWindowManager *wm, void *owner)
+void WM_jobs_kill(wmWindowManager *wm, void *owner, void *startjob)
 {
 	wmJob *steve;
 	
 	for(steve= wm->jobs.first; steve; steve= steve->next)
-		if(steve->owner==owner)
-			break;
-	
-	if (steve) 
-		wm_jobs_kill_job(wm, steve);
+		if(steve->owner==owner || steve->startjob==startjob)
+			wm_jobs_kill_job(wm, steve);
 }
 
 





More information about the Bf-blender-cvs mailing list