mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
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:
@@ -98,9 +98,7 @@ void delete_channel(struct channel *channel)
|
|||||||
wallet_channel_delete(channel->peer->ld->wallet, channel->dbid);
|
wallet_channel_delete(channel->peer->ld->wallet, channel->dbid);
|
||||||
tal_free(channel);
|
tal_free(channel);
|
||||||
|
|
||||||
/* Last one out frees the peer */
|
maybe_delete_peer(peer);
|
||||||
if (list_empty(&peer->channels) && !peer->uncommitted_channel)
|
|
||||||
delete_peer(peer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_channel_basepoints(struct lightningd *ld,
|
void get_channel_basepoints(struct lightningd *ld,
|
||||||
|
|||||||
@@ -586,9 +586,7 @@ static void destroy_uncommitted_channel(struct uncommitted_channel *uc)
|
|||||||
|
|
||||||
uc->peer->uncommitted_channel = NULL;
|
uc->peer->uncommitted_channel = NULL;
|
||||||
|
|
||||||
/* Last one out frees */
|
maybe_delete_peer(uc->peer);
|
||||||
if (list_empty(&uc->peer->channels))
|
|
||||||
delete_peer(uc->peer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns NULL if there's already an opening or active channel for this peer */
|
/* Returns NULL if there's already an opening or active channel for this peer */
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid,
|
|||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void delete_peer(struct peer *peer)
|
static void delete_peer(struct peer *peer)
|
||||||
{
|
{
|
||||||
assert(list_empty(&peer->channels));
|
assert(list_empty(&peer->channels));
|
||||||
assert(!peer->uncommitted_channel);
|
assert(!peer->uncommitted_channel);
|
||||||
@@ -127,6 +127,16 @@ void delete_peer(struct peer *peer)
|
|||||||
tal_free(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 *find_peer_by_dbid(struct lightningd *ld, u64 dbid)
|
||||||
{
|
{
|
||||||
struct peer *p;
|
struct peer *p;
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid,
|
|||||||
const struct wireaddr_internal *addr,
|
const struct wireaddr_internal *addr,
|
||||||
const u8 *gfeatures TAKES, const u8 *lfeatures TAKES);
|
const u8 *gfeatures TAKES, const u8 *lfeatures TAKES);
|
||||||
|
|
||||||
/* Also removes from db. */
|
/* Last one out deletes peer. Also removes from db. */
|
||||||
void delete_peer(struct peer *peer);
|
void maybe_delete_peer(struct peer *peer);
|
||||||
|
|
||||||
struct peer *peer_by_id(struct lightningd *ld, const struct pubkey *id);
|
struct peer *peer_by_id(struct lightningd *ld, const struct pubkey *id);
|
||||||
struct peer *peer_from_json(struct lightningd *ld,
|
struct peer *peer_from_json(struct lightningd *ld,
|
||||||
|
|||||||
Reference in New Issue
Block a user