diff --git a/lightningd/channel.c b/lightningd/channel.c index 467e90bfa..4d9668dfe 100644 --- a/lightningd/channel.c +++ b/lightningd/channel.c @@ -98,9 +98,7 @@ void delete_channel(struct channel *channel) wallet_channel_delete(channel->peer->ld->wallet, channel->dbid); tal_free(channel); - /* Last one out frees the peer */ - if (list_empty(&peer->channels) && !peer->uncommitted_channel) - delete_peer(peer); + maybe_delete_peer(peer); } void get_channel_basepoints(struct lightningd *ld, diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index bb1359d47..d59e7cb95 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -586,9 +586,7 @@ static void destroy_uncommitted_channel(struct uncommitted_channel *uc) uc->peer->uncommitted_channel = NULL; - /* Last one out frees */ - if (list_empty(&uc->peer->channels)) - delete_peer(uc->peer); + maybe_delete_peer(uc->peer); } /* Returns NULL if there's already an opening or active channel for this peer */ diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 03cbd7636..96726fa75 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -116,7 +116,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid, return peer; } -void delete_peer(struct peer *peer) +static void delete_peer(struct peer *peer) { assert(list_empty(&peer->channels)); assert(!peer->uncommitted_channel); @@ -127,6 +127,16 @@ void delete_peer(struct peer *peer) tal_free(peer); } +/* Last one out deletes peer. */ +void maybe_delete_peer(struct peer *peer) +{ + if (peer->uncommitted_channel) + return; + if (!list_empty(&peer->channels)) + return; + delete_peer(peer); +} + struct peer *find_peer_by_dbid(struct lightningd *ld, u64 dbid) { struct peer *p; diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index 4714eeda9..ea5bcd53b 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -60,8 +60,8 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid, const struct wireaddr_internal *addr, const u8 *gfeatures TAKES, const u8 *lfeatures TAKES); -/* Also removes from db. */ -void delete_peer(struct peer *peer); +/* Last one out deletes peer. Also removes from db. */ +void maybe_delete_peer(struct peer *peer); struct peer *peer_by_id(struct lightningd *ld, const struct pubkey *id); struct peer *peer_from_json(struct lightningd *ld,