mirror of
https://github.com/aljazceru/lightning.git
synced 2026-02-23 15:04:19 +01:00
plugin: simplify hooks calling methods, and make lifetime requirements explicit.
They callback must take ownership of the payload (almost all do, but now it's explicit). And since the payload and cb_arg arguments to plugin_hook_call_() are always identical, make them a single parameter. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -28,13 +28,14 @@
|
||||
* delivery to the plugin, and from a JSON-object to the internal
|
||||
* representation:
|
||||
*
|
||||
* - `serialize_payload` which takes a payload of type `payload_type`
|
||||
* - `serialize_payload` which takes a payload of type `cb_arg_type`
|
||||
* and serializes it into the given `json_stream`. `
|
||||
*
|
||||
* - `response_cb` is called once the plugin has responded (or with
|
||||
* buffer == NULL if there's no plugin). In addition an arbitrary
|
||||
* additional argument of type `cb_arg_type` can be passed along
|
||||
* that may contain any additional context necessary.
|
||||
* that may contain any additional context necessary. It must free
|
||||
* or otherwise take ownership of the cb_arg_type argument.
|
||||
*
|
||||
*
|
||||
* To make hook invocations easier, each hook registered with
|
||||
@@ -69,7 +70,7 @@ AUTODATA_TYPE(hooks, struct plugin_hook);
|
||||
* wrappers generated by the `PLUGIN_HOOK_REGISTER` macro.
|
||||
*/
|
||||
void plugin_hook_call_(struct lightningd *ld, const struct plugin_hook *hook,
|
||||
void *payload, void *cb_arg);
|
||||
tal_t *cb_arg STEALS);
|
||||
|
||||
|
||||
/* Create a small facade in from of `plugin_hook_call_` to make sure
|
||||
@@ -78,13 +79,11 @@ void plugin_hook_call_(struct lightningd *ld, const struct plugin_hook *hook,
|
||||
* the method-name is correct for the call.
|
||||
*/
|
||||
/* FIXME: Find a way to avoid back-to-back declaration and definition */
|
||||
#define PLUGIN_HOOK_CALL_DEF(name, payload_type, response_cb_arg_type) \
|
||||
#define PLUGIN_HOOK_CALL_DEF(name, cb_arg_type) \
|
||||
UNNEEDED static inline void plugin_hook_call_##name( \
|
||||
struct lightningd *ld, payload_type payload, \
|
||||
response_cb_arg_type cb_arg) \
|
||||
struct lightningd *ld, cb_arg_type cb_arg STEALS) \
|
||||
{ \
|
||||
plugin_hook_call_(ld, &name##_hook_gen, (void *)payload, \
|
||||
(void *)cb_arg); \
|
||||
plugin_hook_call_(ld, &name##_hook_gen, cb_arg); \
|
||||
}
|
||||
|
||||
/* Typechecked registration of a plugin hook. We check that the
|
||||
@@ -95,23 +94,22 @@ void plugin_hook_call_(struct lightningd *ld, const struct plugin_hook *hook,
|
||||
* response_cb function accepts the deserialized response format and
|
||||
* an arbitrary extra argument used to maintain context.
|
||||
*/
|
||||
#define REGISTER_PLUGIN_HOOK(name, type, response_cb, response_cb_arg_type, \
|
||||
serialize_payload, payload_type) \
|
||||
#define REGISTER_PLUGIN_HOOK(name, type, response_cb, \
|
||||
serialize_payload, cb_arg_type) \
|
||||
struct plugin_hook name##_hook_gen = { \
|
||||
stringify(name), \
|
||||
type, \
|
||||
typesafe_cb_cast( \
|
||||
void (*)(void *, const char *, const jsmntok_t *), \
|
||||
void (*)(response_cb_arg_type, const char *, \
|
||||
const jsmntok_t *), \
|
||||
void (*)(void *STEALS, const char *, const jsmntok_t *), \
|
||||
void (*)(cb_arg_type STEALS, const char *, const jsmntok_t *), \
|
||||
response_cb), \
|
||||
typesafe_cb_cast(void (*)(void *, struct json_stream *), \
|
||||
void (*)(payload_type, struct json_stream *), \
|
||||
void (*)(cb_arg_type, struct json_stream *), \
|
||||
serialize_payload), \
|
||||
NULL, /* .plugins */ \
|
||||
}; \
|
||||
AUTODATA(hooks, &name##_hook_gen); \
|
||||
PLUGIN_HOOK_CALL_DEF(name, payload_type, response_cb_arg_type);
|
||||
PLUGIN_HOOK_CALL_DEF(name, cb_arg_type)
|
||||
|
||||
bool plugin_hook_register(struct plugin *plugin, const char *method);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user