X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftal%2Ftal.c;h=194e74c68afc8d9662b00a2924a2b2cb1da28fb6;hp=8245aba95028d90a007eb0c4b6edf83284d9b984;hb=ca6991d861a02d1da8d51f71607a4d9d8e145850;hpb=d73447c20d96b86a731ddae5efc0c09a533d3a52;ds=sidebyside diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index 8245aba9..194e74c6 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -258,6 +258,28 @@ static struct destructor *add_destructor_property(struct tal_hdr *t, return prop; } +static bool del_destructor_property(struct tal_hdr *t, + void (*destroy)(void *)) +{ + struct prop_hdr **p; + + for (p = (struct prop_hdr **)&t->prop; *p; p = &(*p)->next) { + struct destructor *d; + + if (is_literal(*p)) + break; + if ((*p)->type != DESTRUCTOR) + continue; + d = (struct destructor *)*p; + if (d->destroy == destroy) { + *p = (*p)->next; + freefn(d); + return true; + } + } + return false; +} + static struct name *add_name_property(struct tal_hdr *t, const char *name) { struct name *prop; @@ -399,6 +421,11 @@ bool tal_add_destructor_(tal_t *ctx, void (*destroy)(void *me)) return add_destructor_property(debug_tal(to_tal_hdr(ctx)), destroy); } +bool tal_del_destructor_(tal_t *ctx, void (*destroy)(void *me)) +{ + return del_destructor_property(debug_tal(to_tal_hdr(ctx)), destroy); +} + bool tal_set_name_(tal_t *ctx, const char *name, bool literal) { struct tal_hdr *t = debug_tal(to_tal_hdr(ctx));