]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
trigger: Provide way for instance handlers to preempt run.
authorRay Strode <rstrode@redhat.com>
Tue, 29 Nov 2022 18:15:16 +0000 (13:15 -0500)
committerRay Strode <rstrode@redhat.com>
Tue, 29 Nov 2022 18:33:44 +0000 (13:33 -0500)
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.

src/libply/ply-trigger.c
src/libply/ply-trigger.h

index dda73d3d7f4d71a3d52fb4f0c1707f2a0db99641..2a660a3fb732a8ace11a9aff8f01e9b6d095d505 100644 (file)
@@ -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;
         }
 
index bb088386864fa9ae57aee821186adfb8449022a2..461e9deddea6e6277008d65b54d6fe6fecf0d533 100644 (file)
 
 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);