diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2015-01-08 14:40:27 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-01-20 11:30:09 +0300 |
commit | b292d783f28958a54f608375e6e99a92be5522d6 (patch) | |
tree | 0a243224369edb837843d9514fdd20fd834b89ef /source/blender/blenkernel/intern | |
parent | 1727a165dd165d2ce392e7a31691db19fb093a5f (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_distribute.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 25 |
3 files changed, 17 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index aa62b7778c9..847cae9f0fc 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -2587,6 +2587,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 90338e96945..7a422abae47 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 93eb273fc00..6e7e341e1cc 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) |