Browse Source

ccan: update to latest version which allows destructors to self-delete.

Also, a fix for compiling with NDEBUG.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
travis-debug
Rusty Russell 5 years ago
parent
commit
9d9480f17e
  1. 2
      ccan/README
  2. 13
      ccan/ccan/tal/tal.c
  3. 6
      ccan/ccan/tal/tal.h
  4. 14
      ccan/ccan/tal/test/run-destructor.c
  5. 2
      ccan/ccan/timer/timer.c

2
ccan/README

@ -1,3 +1,3 @@
CCAN imported from http://ccodearchive.net. CCAN imported from http://ccodearchive.net.
CCAN version: init-2494-g4f20b75c CCAN version: init-2495-gc910bdce

13
ccan/ccan/tal/tal.c

@ -53,7 +53,7 @@ struct name {
struct notifier { struct notifier {
struct prop_hdr hdr; /* NOTIFIER */ struct prop_hdr hdr; /* NOTIFIER */
enum tal_notify_type types; enum tal_notify_type types;
union { union notifier_cb {
void (*notifyfn)(tal_t *, enum tal_notify_type, void *); void (*notifyfn)(tal_t *, enum tal_notify_type, void *);
void (*destroy)(tal_t *); /* If NOTIFY_IS_DESTRUCTOR set */ void (*destroy)(tal_t *); /* If NOTIFY_IS_DESTRUCTOR set */
void (*destroy2)(tal_t *, void *); /* If NOTIFY_EXTRA_ARG */ void (*destroy2)(tal_t *, void *); /* If NOTIFY_EXTRA_ARG */
@ -228,11 +228,16 @@ static void notify(const struct tal_hdr *ctx,
if (n->types & type) { if (n->types & type) {
errno = saved_errno; errno = saved_errno;
if (n->types & NOTIFY_IS_DESTRUCTOR) { if (n->types & NOTIFY_IS_DESTRUCTOR) {
/* Blatt this notifier in case it tries to
* tal_del_destructor() from inside */
union notifier_cb cb = n->u;
/* It's a union, so this NULLs destroy2 too! */
n->u.destroy = NULL;
if (n->types & NOTIFY_EXTRA_ARG) if (n->types & NOTIFY_EXTRA_ARG)
n->u.destroy2(from_tal_hdr(ctx), cb.destroy2(from_tal_hdr(ctx),
EXTRA_ARG(n)); EXTRA_ARG(n));
else else
n->u.destroy(from_tal_hdr(ctx)); cb.destroy(from_tal_hdr(ctx));
} else } else
n->u.notifyfn(from_tal_hdr_or_null(ctx), type, n->u.notifyfn(from_tal_hdr_or_null(ctx), type,
(void *)info); (void *)info);

6
ccan/ccan/tal/tal.h

@ -164,7 +164,8 @@ void *tal_free(const tal_t *p);
* @function: the function to call before it's freed. * @function: the function to call before it's freed.
* *
* If @function has not been successfully added as a destructor, this returns * If @function has not been successfully added as a destructor, this returns
* false. * false. Note that if we're inside the destructor call itself, this will
* return false.
*/ */
#define tal_del_destructor(ptr, function) \ #define tal_del_destructor(ptr, function) \
tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr))) tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr)))
@ -195,7 +196,8 @@ void *tal_free(const tal_t *p);
* @function: the function to call before it's freed. * @function: the function to call before it's freed.
* *
* If @function has not been successfully added as a destructor, this returns * If @function has not been successfully added as a destructor, this returns
* false. * false. Note that if we're inside the destructor call itself, this will
* return false.
*/ */
#define tal_del_destructor(ptr, function) \ #define tal_del_destructor(ptr, function) \
tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr))) tal_del_destructor_((ptr), typesafe_cb(void, void *, (function), (ptr)))

14
ccan/ccan/tal/test/run-destructor.c

@ -29,11 +29,17 @@ static void destroy_inc(char *p UNNEEDED)
destroy_count++; destroy_count++;
} }
static void remove_own_destructor(char *p)
{
destroy_count++;
ok1(!tal_del_destructor(p, remove_own_destructor));
}
int main(void) int main(void)
{ {
char *child2; char *child2;
plan_tests(18); plan_tests(21);
destroy_count = 0; destroy_count = 0;
parent = tal(NULL, char); parent = tal(NULL, char);
@ -63,6 +69,12 @@ int main(void)
tal_free(parent); tal_free(parent);
ok1(destroy_count == 4); ok1(destroy_count == 4);
destroy_count = 0;
parent = tal(NULL, char);
ok1(tal_add_destructor(parent, remove_own_destructor));
tal_free(parent);
ok1(destroy_count == 1);
tal_cleanup(); tal_cleanup();
return exit_status(); return exit_status();
} }

2
ccan/ccan/timer/timer.c

@ -97,7 +97,7 @@ void timer_init(struct timer *t)
list_node_init(&t->list); list_node_init(&t->list);
} }
static bool list_node_initted(const struct list_node *n) static inline bool list_node_initted(const struct list_node *n)
{ {
return n->prev == n; return n->prev == n;
} }

Loading…
Cancel
Save