From: Ray Strode Date: Tue, 29 Nov 2022 18:15:16 +0000 (-0500) Subject: trigger: Provide way for instance handlers to preempt run. X-Git-Tag: 23.51.283~43^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5a9b24f18e551e1c058fac0557006b1cd5115a58;p=thirdparty%2Fplymouth.git trigger: Provide way for instance handlers to preempt run. This commit adds a way for instance handlers to say "My handler completed things, don't run any other handlers". It does that by adding a boolean return value to the handler type and making the callers return true for done. Note, this commit doesn't update the callers to use the new api, so it's sort of leaving things in a broken state. The next commit will update the callers. --- diff --git a/src/libply/ply-trigger.c b/src/libply/ply-trigger.c index dda73d3d..2a660a3f 100644 --- a/src/libply/ply-trigger.c +++ b/src/libply/ply-trigger.c @@ -226,6 +226,7 @@ ply_trigger_pull (ply_trigger_t *trigger, while (node != NULL) { ply_list_node_t *next_node; ply_trigger_closure_t *closure; + ply_trigger_handler_result_t result = PLY_TRIGGER_HANDLER_RESULT_CONTINUE; closure = (ply_trigger_closure_t *) ply_list_node_get_data (node); @@ -235,12 +236,15 @@ ply_trigger_pull (ply_trigger_t *trigger, closure->handler (closure->user_data, data, trigger); break; case PLY_TRIGGER_HANDLER_TYPE_INSTANCE_HANDLER: - closure->instance_handler (closure->user_data, trigger->instance, data, trigger); + result = closure->instance_handler (closure->user_data, trigger->instance, data, trigger); break; default: break; } + if (result == PLY_TRIGGER_HANDLER_RESULT_ABORT) + break; + node = next_node; } diff --git a/src/libply/ply-trigger.h b/src/libply/ply-trigger.h index bb088386..461e9ded 100644 --- a/src/libply/ply-trigger.h +++ b/src/libply/ply-trigger.h @@ -30,14 +30,20 @@ typedef struct _ply_trigger ply_trigger_t; +typedef enum +{ + PLY_TRIGGER_HANDLER_RESULT_CONTINUE = false, + PLY_TRIGGER_HANDLER_RESULT_ABORT = true +} ply_trigger_handler_result_t; + typedef void (*ply_trigger_handler_t) (void *user_data, const void *trigger_data, ply_trigger_t *trigger); -typedef void (*ply_trigger_instance_handler_t) (void *user_data, - void *instance, - const void *trigger_data, - ply_trigger_t *trigger); +typedef ply_trigger_handler_result_t (*ply_trigger_instance_handler_t) (void *user_data, + void *instance, + const void *trigger_data, + ply_trigger_t *trigger); #ifndef PLY_HIDE_FUNCTION_DECLARATIONS ply_trigger_t *ply_trigger_new (ply_trigger_t **free_address);