lightningd: handle channel cleanups more explicitly.

1. Freeing an unconfirmed channel already releases the subd, so don't
   do that explicitly.
2. Use channel->owner to transfer ownership where possible, using
   channel_set_owner() which handles all the cases.

This simplifies the code and makes it more readable, IMHO.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2021-12-28 09:51:09 +10:30
parent 18526a3a5b
commit 90b669857e
6 changed files with 11 additions and 19 deletions

View File

@ -826,7 +826,7 @@ void channel_internal_error(struct channel *channel, const char *fmt, ...)
channel_cleanup_commands(channel, why);
if (channel_unsaved(channel)) {
subd_release_channel(channel->owner, channel);
channel_set_owner(channel, NULL);
delete_channel(channel);
tal_free(why);
return;

View File

@ -17,8 +17,9 @@
static void destroy_uncommitted_channel(struct uncommitted_channel *uc)
{
if (uc->open_daemon) {
struct subd *open_daemon = uc->open_daemon;
if (open_daemon) {
uc->open_daemon = NULL;
subd_release_channel(open_daemon, uc);
}
@ -115,10 +116,6 @@ void kill_uncommitted_channel(struct uncommitted_channel *uc,
{
log_info(uc->log, "Killing opening daemon: %s", why);
/* Close opend daemon. */
subd_release_channel(uc->open_daemon, uc);
uc->open_daemon = NULL;
uncommitted_channel_disconnect(uc, LOG_INFORM, why);
tal_free(uc);
}

View File

@ -319,9 +319,7 @@ static void opening_funder_start_replied(struct subd *openingd, const u8 *resp,
return;
failed:
subd_release_channel(openingd, fc->uc);
fc->uc->open_daemon = NULL;
/* Frees fc too, and tmpctx */
/* Frees fc too */
tal_free(fc->uc);
}
@ -414,9 +412,7 @@ static void opening_funder_finished(struct subd *openingd, const u8 *resp,
peer_start_channeld(channel, pps, NULL, false, NULL);
cleanup:
subd_release_channel(openingd, fc->uc);
fc->uc->open_daemon = NULL;
/* Frees fc too, and tmpctx */
/* Frees fc too */
tal_free(fc->uc);
}
@ -528,8 +524,6 @@ static void opening_fundee_finished(struct subd *openingd,
/* On to normal operation! */
peer_start_channeld(channel, pps, fwd_msg, false, NULL);
subd_release_channel(openingd, uc);
uc->open_daemon = NULL;
tal_free(uc);
return;

View File

@ -888,7 +888,7 @@ struct subd *subd_shutdown(struct subd *sd, unsigned int seconds)
return tal_free(sd);
}
void subd_release_channel(struct subd *owner, void *channel)
void subd_release_channel(struct subd *owner, const void *channel)
{
/* If owner is a per-peer-daemon, and not already freeing itself... */
if (owner->channel) {

View File

@ -197,9 +197,10 @@ void subd_req_(const tal_t *ctx,
* @channel: channel to release.
*
* If the subdaemon is not already shutting down, and it is a per-channel
* subdaemon, this shuts it down.
* subdaemon, this shuts it down. Don't call this directly, use
* channel_set_owner() or uncommitted_channel_release_subd().
*/
void subd_release_channel(struct subd *owner, void *channel);
void subd_release_channel(struct subd *owner, const void *channel);
/**
* subd_shutdown - try to politely shut down a subdaemon.

View File

@ -654,7 +654,7 @@ u8 *serialize_onionpacket(
const struct onionpacket *packet UNNEEDED)
{ fprintf(stderr, "serialize_onionpacket called!\n"); abort(); }
/* Generated stub for subd_release_channel */
void subd_release_channel(struct subd *owner UNNEEDED, void *channel UNNEEDED)
void subd_release_channel(struct subd *owner UNNEEDED, const void *channel UNNEEDED)
{ fprintf(stderr, "subd_release_channel called!\n"); abort(); }
/* Generated stub for subd_req_ */
void subd_req_(const tal_t *ctx UNNEEDED,