Fix crash rendering grass_wind.blend from regression tests. The real
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 22 Jan 2010 11:03:55 +0000 (11:03 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 22 Jan 2010 11:03:55 +0000 (11:03 +0000)
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.

source/blender/blenkernel/BKE_blender.h
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/effect.c
source/blender/blenkernel/intern/object.c

index 5d264be..a4a8f25 100644 (file)
@@ -62,12 +62,6 @@ void BKE_userdef_free(void);
 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);
index 6181712..226aa82 100644 (file)
@@ -103,76 +103,6 @@ short ENDIAN_ORDER;
 
 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 */
index 83f63c9..b261d33 100644 (file)
@@ -658,6 +658,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
                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*/
index fd4f98e..1063fa8 100644 (file)
@@ -1983,7 +1983,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
        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,21 +2001,19 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
                
                /* 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;
                }
-               
-               solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
-               
-               if(pop) {
-                       poplast(par);
-               }
+               else
+                       solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
                
                if(ob->partype & PARSLOW) {
                        // include framerate