mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-17 19:03:42 +01:00
state: use an enum for the completion.
Instead of overloading complete_data. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
ba73787ecc
commit
188d0b76a4
30
state.c
30
state.c
@ -1,8 +1,6 @@
|
||||
#include <state.h>
|
||||
#include <ccan/build_assert/build_assert.h>
|
||||
|
||||
char cmd_requeue;
|
||||
|
||||
static inline bool high_priority(enum state state)
|
||||
{
|
||||
return (state & 1) == (STATE_NORMAL_HIGHPRIO & 1);
|
||||
@ -20,7 +18,8 @@ static inline bool high_priority(enum state state)
|
||||
#define INIT_EFFECT_unwatch NULL
|
||||
#define INIT_EFFECT_defer INPUT_NONE
|
||||
#define INIT_EFFECT_complete INPUT_NONE
|
||||
#define INIT_EFFECT_complete_data NULL
|
||||
#define INIT_EFFECT_status CMD_STATUS_ONGOING
|
||||
#define INIT_EFFECT_faildata NULL
|
||||
#define INIT_EFFECT_stop_packets false
|
||||
#define INIT_EFFECT_stop_commands false
|
||||
#define INIT_EFFECT_close_timeout INPUT_NONE
|
||||
@ -43,7 +42,8 @@ void state_effect_init(struct state_effect *effect)
|
||||
effect->unwatch = INIT_EFFECT_unwatch;
|
||||
effect->defer = INIT_EFFECT_defer;
|
||||
effect->complete = INIT_EFFECT_complete;
|
||||
effect->complete_data = INIT_EFFECT_complete_data;
|
||||
effect->status = INIT_EFFECT_status;
|
||||
effect->faildata = INIT_EFFECT_faildata;
|
||||
effect->stop_packets = INIT_EFFECT_stop_packets;
|
||||
effect->stop_commands = INIT_EFFECT_stop_commands;
|
||||
effect->close_timeout = INIT_EFFECT_close_timeout;
|
||||
@ -72,15 +72,23 @@ static void fail_cmd(struct state_effect *effect,
|
||||
void *faildata)
|
||||
{
|
||||
set_effect(effect, complete, input);
|
||||
/* Use dummy value if they don't want one. */
|
||||
set_effect(effect, complete_data, faildata ? faildata : effect);
|
||||
set_effect(effect, status, CMD_STATUS_FAILED);
|
||||
if (faildata)
|
||||
set_effect(effect, faildata, faildata);
|
||||
}
|
||||
|
||||
static void requeue_cmd(struct state_effect *effect,
|
||||
const enum state_input input)
|
||||
{
|
||||
set_effect(effect, complete, input);
|
||||
set_effect(effect, complete_data, &cmd_requeue);
|
||||
set_effect(effect, status, CMD_STATUS_REQUEUE);
|
||||
}
|
||||
|
||||
static void complete_cmd(struct state_effect *effect,
|
||||
const enum state_input input)
|
||||
{
|
||||
set_effect(effect, complete, input);
|
||||
set_effect(effect, status, CMD_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
enum state state(const enum state state, const struct state_data *sdata,
|
||||
@ -473,7 +481,7 @@ enum state state(const enum state state, const struct state_data *sdata,
|
||||
idata->pkt);
|
||||
if (err)
|
||||
goto err_start_unilateral_close;
|
||||
set_effect(effect, complete, CMD_SEND_UPDATE_ANY);
|
||||
complete_cmd(effect, CMD_SEND_UPDATE_ANY);
|
||||
return toggle_prio(state, STATE_NORMAL);
|
||||
} else if (input_is(input, BITCOIN_ANCHOR_UNSPENT)) {
|
||||
fail_cmd(effect, CMD_SEND_UPDATE_ANY, NULL);
|
||||
@ -533,7 +541,7 @@ enum state state(const enum state state, const struct state_data *sdata,
|
||||
idata->pkt);
|
||||
if (err)
|
||||
goto err_start_unilateral_close;
|
||||
set_effect(effect, complete, CMD_CLOSE);
|
||||
complete_cmd(effect, CMD_CLOSE);
|
||||
set_effect(effect, send, pkt_close_ack(effect, sdata));
|
||||
set_effect(effect, broadcast,
|
||||
bitcoin_close(effect, sdata));
|
||||
@ -546,7 +554,7 @@ enum state state(const enum state state, const struct state_data *sdata,
|
||||
idata->pkt);
|
||||
if (err)
|
||||
goto err_start_unilateral_close;
|
||||
set_effect(effect, complete, CMD_CLOSE);
|
||||
complete_cmd(effect, CMD_CLOSE);
|
||||
set_effect(effect, send, pkt_close_ack(effect, sdata));
|
||||
set_effect(effect, broadcast,
|
||||
bitcoin_close(effect, sdata));
|
||||
@ -1027,7 +1035,7 @@ instant_close:
|
||||
* Closing, but we haven't sent anything to the blockchain so
|
||||
* there's nothing to clean up.
|
||||
*/
|
||||
set_effect(effect, complete, CMD_CLOSE);
|
||||
complete_cmd(effect, CMD_CLOSE);
|
||||
/* FIXME: Should we tell other side we're going? */
|
||||
set_effect(effect, stop_packets, true);
|
||||
set_effect(effect, stop_commands, true);
|
||||
|
14
state.h
14
state.h
@ -4,14 +4,19 @@
|
||||
#include <stdbool.h>
|
||||
#include <ccan/tal/tal.h>
|
||||
|
||||
enum cmd_complete_status {
|
||||
CMD_STATUS_ONGOING,
|
||||
CMD_STATUS_FAILED,
|
||||
CMD_STATUS_SUCCESS,
|
||||
CMD_STATUS_REQUEUE
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the core state machine.
|
||||
*
|
||||
* Calling the state machine with an input simply returns the new state,
|
||||
* and populates the "effect" struct with what it wants done.
|
||||
*/
|
||||
extern char cmd_requeue;
|
||||
|
||||
struct state_effect {
|
||||
/* Transaction to broadcast. */
|
||||
struct bitcoin_tx *broadcast;
|
||||
@ -30,9 +35,8 @@ struct state_effect {
|
||||
|
||||
/* Complete a command. */
|
||||
enum state_input complete;
|
||||
/* NULL on success, &cmd_requeue on requeue, otherwise
|
||||
* command-specific fail information. */
|
||||
void *complete_data;
|
||||
enum cmd_complete_status status;
|
||||
void *faildata;
|
||||
|
||||
/* Stop taking packets? commands? */
|
||||
bool stop_packets, stop_commands;
|
||||
|
Loading…
Reference in New Issue
Block a user