[Bf-blender-cvs] [bdf24b7] temp_merge_gooseberry_hair: Separate context freeing from task freeing in threaded particle updates to prevent double-freeing/invalid mem access.

Lukas Tönne noreply at git.blender.org
Mon Jan 19 20:51:33 CET 2015


Commit: bdf24b7f4f87ceafc965e0ff3fd24e953ec6de89
Author: Lukas Tönne
Date:   Thu Jan 8 12:40:27 2015 +0100
Branches: temp_merge_gooseberry_hair
https://developer.blender.org/rBbdf24b7f4f87ceafc965e0ff3fd24e953ec6de89

Separate context freeing from task freeing in threaded particle updates
to prevent double-freeing/invalid mem access.

This can happen with the "virtual parents" feature, which generates both
parent and child paths. Each task free function also freed the shared
context, leading to double freeing.

===================================================================

M	source/blender/blenkernel/BKE_particle.h
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_distribute.c
M	source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index f89b4ab..0564515 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -350,6 +350,7 @@ void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct Pa
                                    struct ParticleCacheKey *cache, float mat[4][4], float *scale);
 
 void psys_thread_context_init(struct ParticleThreadContext *ctx, struct ParticleSimulationData *sim);
+void psys_thread_context_free(struct ParticleThreadContext *ctx);
 void psys_tasks_create(struct ParticleThreadContext *ctx, int totpart, struct ParticleTask **r_tasks, int *r_numtasks);
 void psys_tasks_free(struct ParticleTask *tasks, int numtasks);
 
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 222b0f4..fd9dc21 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -2586,6 +2586,8 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
 	
 	psys_tasks_free(tasks_parent, numtasks_parent);
 	psys_tasks_free(tasks_child, numtasks_child);
+	
+	psys_thread_context_free(&ctx);
 }
 
 /* figure out incremental rotations along path starting from unit quat */
diff --git a/source/blender/blenkernel/intern/particle_distribute.c b/source/blender/blenkernel/intern/particle_distribute.c
index 90338e9..7a422ab 100644
--- a/source/blender/blenkernel/intern/particle_distribute.c
+++ b/source/blender/blenkernel/intern/particle_distribute.c
@@ -1140,6 +1140,8 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
 		ctx.dm->release(ctx.dm);
 	
 	psys_tasks_free(tasks, numtasks);
+	
+	psys_thread_context_free(&ctx);
 }
 
 /* ready for future use, to emit particles without geometry */
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 803721a..0f02f34 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -471,13 +471,24 @@ void psys_tasks_create(ParticleThreadContext *ctx, int totpart, ParticleTask **r
 
 void psys_tasks_free(ParticleTask *tasks, int numtasks)
 {
-	ParticleThreadContext *ctx;
 	int i;
 	
 	if (numtasks == 0)
 		return;
 	
-	ctx = tasks[0].ctx;
+	/* threads */
+	for (i = 0; i < numtasks; ++i) {
+		if (tasks[i].rng)
+			BLI_rng_free(tasks[i].rng);
+		if (tasks[i].rng_path)
+			BLI_rng_free(tasks[i].rng_path);
+	}
+
+	MEM_freeN(tasks);
+}
+
+void psys_thread_context_free(ParticleThreadContext *ctx)
+{
 	/* path caching */
 	if (ctx->vg_length)
 		MEM_freeN(ctx->vg_length);
@@ -506,16 +517,6 @@ void psys_tasks_free(ParticleTask *tasks, int numtasks)
 	if (ctx->seams) MEM_freeN(ctx->seams);
 	//if (ctx->vertpart) MEM_freeN(ctx->vertpart);
 	BLI_kdtree_free(ctx->tree);
-
-	/* threads */
-	for (i = 0; i < numtasks; ++i) {
-		if (tasks[i].rng)
-			BLI_rng_free(tasks[i].rng);
-		if (tasks[i].rng_path)
-			BLI_rng_free(tasks[i].rng_path);
-	}
-
-	MEM_freeN(tasks);
 }
 
 static void initialize_particle_texture(ParticleSimulationData *sim, ParticleData *pa, int p)




More information about the Bf-blender-cvs mailing list