From: Ray Strode Date: Wed, 16 Sep 2009 17:39:35 +0000 (-0400) Subject: [trigger] add new ignore_next_pull method X-Git-Tag: 0.8.0~188^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dfa457ba50250e104c117cd1bf1fa35878f7d9aa;p=thirdparty%2Fplymouth.git [trigger] add new ignore_next_pull method 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. --- diff --git a/src/libply/ply-trigger.c b/src/libply/ply-trigger.c index b1952d71..46ea5477 100644 --- a/src/libply/ply-trigger.c +++ b/src/libply/ply-trigger.c @@ -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) diff --git a/src/libply/ply-trigger.h b/src/libply/ply-trigger.h index cf9fbf09..d543f042 100644 --- a/src/libply/ply-trigger.h +++ b/src/libply/ply-trigger.h @@ -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