From dfa457ba50250e104c117cd1bf1fa35878f7d9aa Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 16 Sep 2009 13:39:35 -0400 Subject: [PATCH] [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. --- src/libply/ply-trigger.c | 15 +++++++++++++++ src/libply/ply-trigger.h | 1 + 2 files changed, 16 insertions(+) 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