From 78ff67ba5c701d946574e00daf4beccd2efae3f1 Mon Sep 17 00:00:00 2001 From: Ivica Ico Bukvic <ico@vt.edu> Date: Wed, 27 Mar 2013 17:02:26 -0400 Subject: [PATCH] hopefully finally fixed delayed free mess --- pd/src/m_pd.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/pd/src/m_pd.c b/pd/src/m_pd.c index be5ed6ad8..14b3870ad 100644 --- a/pd/src/m_pd.c +++ b/pd/src/m_pd.c @@ -68,6 +68,7 @@ typedef struct _bindelem { t_pd *e_who; struct _bindelem *e_next; + int e_delayed_free; } t_bindelem; typedef struct _bindlist @@ -82,7 +83,7 @@ static void bindlist_cleanup(t_bindlist *x) { //fprintf(stderr,"bindlist_cleanup\n"); t_bindelem *e, *e2; - if (x->b_list->e_who == NULL) + if (x->b_list->e_delayed_free == 1) { e = x->b_list; x->b_list = e->e_next; @@ -90,7 +91,7 @@ static void bindlist_cleanup(t_bindlist *x) //fprintf(stderr,"success B1a\n"); } for (e = x->b_list; e2 = e->e_next; e = e2) - if (e2->e_who == NULL) + if (e2->e_delayed_free == 1) { e->e_next = e2->e_next; freebytes(e2, sizeof(t_bindelem)); @@ -197,6 +198,7 @@ void pd_bind(t_pd *x, t_symbol *s) t_bindelem *e = (t_bindelem *)getbytes(sizeof(t_bindelem)); e->e_next = b->b_list; e->e_who = x; + e->e_delayed_free = 0; b->b_list = e; } else @@ -208,8 +210,10 @@ void pd_bind(t_pd *x, t_symbol *s) b->b_list = e1; e1->e_who = x; e1->e_next = e2; + e1->e_delayed_free = 0; e2->e_who = s->s_thing; e2->e_next = 0; + e2->e_delayed_free = 0; s->s_thing = &b->b_pd; } } @@ -247,7 +251,7 @@ void pd_unbind(t_pd *x, t_symbol *s) { if (change_bindlist_via_graph) { change_bindlist_via_graph++; - e->e_who = NULL; + e->e_delayed_free = 1; } else { b->b_list = e->e_next; freebytes(e, sizeof(t_bindelem)); @@ -259,7 +263,7 @@ void pd_unbind(t_pd *x, t_symbol *s) { if (change_bindlist_via_graph) { change_bindlist_via_graph++; - e2->e_who = NULL; + e2->e_delayed_free = 0; } else { e->e_next = e2->e_next; freebytes(e2, sizeof(t_bindelem)); @@ -301,16 +305,19 @@ t_pd *pd_findbyclass(t_symbol *s, t_class *c) t_bindelem *e, *e2; int warned = 0; for (e = b->b_list; e; e = e->e_next) - if (e->e_who != NULL && *e->e_who == c) - { - if (x && !warned) - { - zz(); - post("warning: %s: multiply defined", s->s_name); - warned = 1; - } - x = e->e_who; - } + { + //if (e->e_who != NULL && *e->e_who == c) + if (e->e_delayed_free != 1 && *e->e_who == c) + { + if (x && !warned) + { + zz(); + post("warning: %s: multiply defined", s->s_name); + warned = 1; + } + x = e->e_who; + } + } } return x; } -- GitLab