lightningd: centralize refcounting behaviour for peers.

It's mildly neater this way.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2018-08-02 16:19:55 +09:30
parent 0ebad456b1
commit 8bffd2b604
4 changed files with 15 additions and 9 deletions

View File

@ -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,

View File

@ -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 */

View File

@ -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;

View File

@ -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,