[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.
This commit is contained in:
Ray Strode 2009-09-16 13:39:35 -04:00
parent 1a516d3635
commit dfa457ba50
2 changed files with 16 additions and 0 deletions

View 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)

View 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