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;
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));
#define tal_add_destructor(ptr, function) \
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.
* @ptr: The tal allocated object.
bool tal_resize_(tal_t **ctxp, size_t size);
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 */
{
char *child2;
- plan_tests(12);
+ plan_tests(18);
+ 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));
-
tal_free(parent);
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);
child = tal(parent, char);
child2 = tal(parent, char);
ok1(tal_add_destructor(child, destroy_inc));
ok1(tal_add_destructor(child2, destroy_inc));
tal_free(parent);
- ok1(destroy_count == 6);
+ ok1(destroy_count == 4);
return exit_status();
}