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.
This commit is contained in:
2015-01-08 12:40:27 +01:00
parent 1727a165dd
commit b292d783f2
4 changed files with 18 additions and 12 deletions

View File

@@ -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)