Commit ca6991d8 authored by Rusty Russell's avatar Rusty Russell

tal: add del_destructor().

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent d73447c2
...@@ -258,6 +258,28 @@ static struct destructor *add_destructor_property(struct tal_hdr *t, ...@@ -258,6 +258,28 @@ static struct destructor *add_destructor_property(struct tal_hdr *t,
return prop; 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) static struct name *add_name_property(struct tal_hdr *t, const char *name)
{ {
struct name *prop; struct name *prop;
...@@ -399,6 +421,11 @@ bool tal_add_destructor_(tal_t *ctx, void (*destroy)(void *me)) ...@@ -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); 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) bool tal_set_name_(tal_t *ctx, const char *name, bool literal)
{ {
struct tal_hdr *t = debug_tal(to_tal_hdr(ctx)); struct tal_hdr *t = debug_tal(to_tal_hdr(ctx));
......
...@@ -130,6 +130,17 @@ void *tal_free(const tal_t *p); ...@@ -130,6 +130,17 @@ void *tal_free(const tal_t *p);
#define tal_add_destructor(ptr, function) \ #define tal_add_destructor(ptr, function) \
tal_add_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr))) tal_add_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr)))
/**
* tal_del_destructor - remove a destructor callback function.
* @ptr: The tal allocated object.
* @function: the function to call before it's freed.
*
* If @function has not been successfully added as a destructor, this returns
* false.
*/
#define tal_del_destructor(ptr, function) \
tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr)))
/** /**
* tal_set_name - attach a name to a tal pointer. * tal_set_name - attach a name to a tal pointer.
* @ptr: The tal allocated object. * @ptr: The tal allocated object.
...@@ -324,5 +335,6 @@ tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t); ...@@ -324,5 +335,6 @@ tal_t *tal_steal_(const tal_t *new_parent, const tal_t *t);
bool tal_resize_(tal_t **ctxp, size_t size); bool tal_resize_(tal_t **ctxp, size_t size);
bool tal_add_destructor_(tal_t *ctx, void (*destroy)(void *me)); bool tal_add_destructor_(tal_t *ctx, void (*destroy)(void *me));
bool tal_del_destructor_(tal_t *ctx, void (*destroy)(void *me));
#endif /* CCAN_TAL_H */ #endif /* CCAN_TAL_H */
...@@ -33,16 +33,26 @@ int main(void) ...@@ -33,16 +33,26 @@ int main(void)
{ {
char *child2; char *child2;
plan_tests(12); plan_tests(18);
destroy_count = 0;
parent = tal(NULL, char); parent = tal(NULL, char);
child = tal(parent, char); child = tal(parent, char);
ok1(tal_add_destructor(parent, destroy_parent)); ok1(tal_add_destructor(parent, destroy_parent));
ok1(tal_add_destructor(child, destroy_child)); ok1(tal_add_destructor(child, destroy_child));
tal_free(parent); tal_free(parent);
ok1(destroy_count == 2); ok1(destroy_count == 2);
destroy_count = 0;
parent = tal(NULL, char);
child = tal(parent, char);
ok1(tal_add_destructor(parent, destroy_parent));
ok1(tal_add_destructor(child, destroy_child));
ok1(tal_del_destructor(child, destroy_child));
tal_free(parent);
ok1(destroy_count == 1);
destroy_count = 0;
parent = tal(NULL, char); parent = tal(NULL, char);
child = tal(parent, char); child = tal(parent, char);
child2 = tal(parent, char); child2 = tal(parent, char);
...@@ -51,7 +61,7 @@ int main(void) ...@@ -51,7 +61,7 @@ int main(void)
ok1(tal_add_destructor(child, destroy_inc)); ok1(tal_add_destructor(child, destroy_inc));
ok1(tal_add_destructor(child2, destroy_inc)); ok1(tal_add_destructor(child2, destroy_inc));
tal_free(parent); tal_free(parent);
ok1(destroy_count == 6); ok1(destroy_count == 4);
return exit_status(); return exit_status();
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment