]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[trigger] add new ignore_next_pull method
authorRay Strode <rstrode@redhat.com>
Wed, 16 Sep 2009 17:39:35 +0000 (13:39 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 28 Sep 2009 15:23:39 +0000 (11:23 -0400)
It can be cumbersome to wait for multiple operations to finish before
pulling a trigger.  In those cases, one option would be to have a
separate trigger for each operation, and then wait until every trigger
is pulled before pulling the main trigger.

This commit instead allows a trigger to get pulled more
than once before it actually fires.  By calling ignore_next_pull
once for each suboperaton, and immediately pulling the trigger,
it won't fire until the last operation finishes.

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

index b1952d71cdabb94f1d1c73f620f4a82a870000d2..46ea5477185cf6f369b82d30a4397ef451bbf4aa 100644 (file)
@@ -41,6 +41,7 @@ struct _ply_trigger
   ply_list_t *closures;
 
   ply_trigger_t **free_address;
+  int ignore_count;
 };
 
 ply_trigger_t *
@@ -51,6 +52,7 @@ ply_trigger_new (ply_trigger_t **free_address)
   trigger = calloc (1, sizeof (ply_trigger_t));
   trigger->free_address = free_address;
   trigger->closures = ply_list_new ();
+  trigger->ignore_count = 0;
 
   return trigger;
 }
@@ -131,6 +133,12 @@ ply_trigger_remove_handler (ply_trigger_t         *trigger,
     }
 }
 
+void
+ply_trigger_ignore_next_pull (ply_trigger_t *trigger)
+{
+  trigger->ignore_count++;
+}
+
 void
 ply_trigger_pull (ply_trigger_t *trigger,
                   const void    *data)
@@ -138,6 +146,13 @@ ply_trigger_pull (ply_trigger_t *trigger,
   ply_list_node_t *node;
 
   assert (trigger != NULL);
+  assert (trigger->ignore_count >= 0);
+
+  if (trigger->ignore_count > 0)
+    {
+      trigger->ignore_count--;
+      return;
+    }
 
   node = ply_list_get_first_node (trigger->closures);
   while (node != NULL)
index cf9fbf091de499628d5cb432c55a42d9486efe65..d543f042c02c43f8bace3aa19c87e39e468d5e48 100644 (file)
@@ -44,6 +44,7 @@ void ply_trigger_remove_handler (ply_trigger_t         *trigger,
                                  void                  *user_data);
 void ply_trigger_free (ply_trigger_t *trigger);
 
+void ply_trigger_ignore_next_pull (ply_trigger_t *trigger);
 void ply_trigger_pull (ply_trigger_t *trigger,
                        const void    *data);
 #endif