diff --git a/config.c b/config.c index 3327ef9..fb77813 100644 --- a/config.c +++ b/config.c @@ -166,7 +166,8 @@ particle_list_from_config(const struct yml_node *node, } struct particle *list = particle_list_new( - parts, count, left_spacing, right_spacing, left_margin, right_margin); + parts, count, left_spacing, right_spacing, left_margin, right_margin, + true); free(parts); return list; diff --git a/particles/list.c b/particles/list.c index 45fb846..dfb6e9a 100644 --- a/particles/list.c +++ b/particles/list.c @@ -5,6 +5,7 @@ struct particle_private { struct particle **particles; size_t count; int left_spacing, right_spacing; + bool has_ownership; }; struct exposable_private { @@ -93,8 +94,12 @@ static void particle_destroy(struct particle *particle) { struct particle_private *p = particle->private; - for (size_t i = 0; i < p->count; i++) - p->particles[i]->destroy(p->particles[i]); + + if (p->has_ownership) { + for (size_t i = 0; i < p->count; i++) + p->particles[i]->destroy(p->particles[i]); + } + free(p->particles); free(p); free(particle); @@ -103,13 +108,15 @@ particle_destroy(struct particle *particle) struct particle * particle_list_new( struct particle *particles[], size_t count, - int left_spacing, int right_spacing, int left_margin, int right_margin) + int left_spacing, int right_spacing, int left_margin, int right_margin, + bool take_ownership) { struct particle_private *p = malloc(sizeof(*p)); p->particles = malloc(count * sizeof(p->particles[0])); p->count = count; p->left_spacing = left_spacing; p->right_spacing = right_spacing; + p->has_ownership = take_ownership; for (size_t i = 0; i < count; i++) p->particles[i] = particles[i]; diff --git a/particles/list.h b/particles/list.h index 5139ba3..49a89c0 100644 --- a/particles/list.h +++ b/particles/list.h @@ -1,6 +1,9 @@ #pragma once + +#include #include "../particle.h" struct particle *particle_list_new( struct particle *particles[], size_t count, - int left_spacing, int right_spacing, int left_margin, int right_margin); + int left_spacing, int right_spacing, int left_margin, int right_margin, + bool take_ownership);