[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26189] trunk/blender/source/blender/ blenkernel: Fix crash rendering grass_wind.blend from regression tests.

Brecht Van Lommel brecht at blender.org
Fri Jan 22 12:03:55 CET 2010


Revision: 26189
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26189
Author:   blendix
Date:     2010-01-22 12:03:55 +0100 (Fri, 22 Jan 2010)

Log Message:
-----------
Fix crash rendering grass_wind.blend from regression tests. The real
problem is that where_is_object is being called from multiple threads
but is not thread-safe, added a note about this problem, this commit
only solves the crash. Also remove the pushdata/popdata mechanism
that was being used here, using this kind of system is bound to give
problems with threading.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenkernel/intern/effect.c
    trunk/blender/source/blender/blenkernel/intern/object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2010-01-22 10:58:02 UTC (rev 26188)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2010-01-22 11:03:55 UTC (rev 26189)
@@ -62,12 +62,6 @@
 void set_blender_test_break_cb(void (*func)(void) );
 int blender_test_break(void);
 
-void pushdata(void *data, int len);
-void popfirst(void *data);
-void poplast(void *data);
-void free_pushpop(void);
-void pushpop_test(void);
-
 /* global undo */
 extern void BKE_write_undo(struct bContext *C, char *name);
 extern void BKE_undo_step(struct bContext *C, int step);

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2010-01-22 10:58:02 UTC (rev 26188)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2010-01-22 11:03:55 UTC (rev 26189)
@@ -103,76 +103,6 @@
 
 char versionstr[48]= "";
 
-/* ************************************************ */
-/* pushpop facility: to store data temporally, FIFO! */
-
-ListBase ppmain={0, 0};
-
-typedef struct PushPop {
-	struct PushPop *next, *prev;
-	void *data;
-	int len;
-} PushPop;
-
-void pushdata(void *data, int len)
-{
-	PushPop *pp;
-	
-	pp= MEM_mallocN(sizeof(PushPop), "pushpop");
-	BLI_addtail(&ppmain, pp);
-	pp->data= MEM_mallocN(len, "pushpop");
-	pp->len= len;
-	memcpy(pp->data, data, len);
-}
-
-void popfirst(void *data)
-{
-	PushPop *pp;
-	
-	pp= ppmain.first;
-	if(pp) {
-		memcpy(data, pp->data, pp->len);
-		BLI_remlink(&ppmain, pp);
-		MEM_freeN(pp->data);
-		MEM_freeN(pp);
-	}
-	else printf("error in popfirst\n");
-}
-
-void poplast(void *data)
-{
-	PushPop *pp;
-	
-	pp= ppmain.last;
-	if(pp) {
-		memcpy(data, pp->data, pp->len);
-		BLI_remlink(&ppmain, pp);
-		MEM_freeN(pp->data);
-		MEM_freeN(pp);
-	}
-	else printf("error in poplast\n");
-}
-
-void free_pushpop()
-{
-	PushPop *pp;
-
-	pp= ppmain.first;
-	while(pp) {
-		BLI_remlink(&ppmain, pp);
-		MEM_freeN(pp->data);
-		MEM_freeN(pp);
-	}	
-}
-
-void pushpop_test()
-{
-	if(ppmain.first) printf("pushpop not empty\n");
-	free_pushpop();
-}
-
-
-
 /* ********** free ********** */
 
 /* only to be called on exit blender */

Modified: trunk/blender/source/blender/blenkernel/intern/effect.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/effect.c	2010-01-22 10:58:02 UTC (rev 26188)
+++ trunk/blender/source/blender/blenkernel/intern/effect.c	2010-01-22 11:03:55 UTC (rev 26189)
@@ -658,6 +658,8 @@
 		Object *ob = eff->ob;
 		Object obcopy = *ob;
 
+		/* XXX this is not thread-safe, but used from multiple threads by
+		   particle system */
 		where_is_object_time(eff->scene, ob, cfra);
 
 		/* use z-axis as normal*/

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2010-01-22 10:58:02 UTC (rev 26188)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2010-01-22 11:03:55 UTC (rev 26189)
@@ -1983,7 +1983,6 @@
 	float *fp1, *fp2, slowmat[4][4] = MAT4_UNITY;
 	float stime=ctime, fac1, fac2, vec[3];
 	int a;
-	int pop; 
 	
 	/* new version: correct parent+vertexparent and track+parent */
 	/* this one only calculates direct attached parent and track */
@@ -2002,22 +2001,20 @@
 		
 		/* hurms, code below conflicts with depgraph... (ton) */
 		/* and even worse, it gives bad effects for NLA stride too (try ctime != par->ctime, with MBlur) */
-		pop= 0;
 		if(no_parent_ipo==0 && stime != par->ctime) {
 			// only for ipo systems? 
-			pushdata(par, sizeof(Object));
-			pop= 1;
+			Object tmp= *par;
 			
 			if(par->proxy_from);	// was a copied matrix, no where_is! bad...
 			else where_is_object_time(scene, par, ctime);
+
+			solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
+
+			*par= tmp;
 		}
+		else
+			solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
 		
-		solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
-		
-		if(pop) {
-			poplast(par);
-		}
-		
 		if(ob->partype & PARSLOW) {
 			// include framerate
 			fac1= ( 1.0f / (1.0f + (float)fabs(give_timeoffset(ob))) );





More information about the Bf-blender-cvs mailing list