Skip to content

Commit

Permalink
Don't enqueue the outermost trigger, since we immediately dequeue it …
Browse files Browse the repository at this point in the history
…anyway
  • Loading branch information
nblumhardt committed Nov 2, 2016
1 parent c46168f commit cf5d354
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions src/Stateless/StateMachine.cs
Expand Up @@ -18,14 +18,14 @@ public partial class StateMachine<TState, TTrigger>
UnhandledTriggerAction _unhandledTriggerAction;
OnTransitionedEvent _onTransitionedEvent;

private class QueuedTrigger
class QueuedTrigger
{
public TTrigger Trigger { get; set; }
public object[] Args { get; set; }
}

readonly Queue<QueuedTrigger> _eventQueue = new Queue<QueuedTrigger>();
private bool _firing;
bool _firing;

/// <summary>
/// Construct a state machine with external state storage.
Expand Down Expand Up @@ -193,11 +193,6 @@ public void Fire<TArg0>(TriggerWithParameters<TArg0> trigger, TArg0 arg0)
/// will not lead to re-execution of activation callbacks.
/// </summary>
public void Activate()
/// Queue events and then fire in order.
/// If only one event is queued, this behaves identically to the non-queued version.
/// </summary>
/// <param name="trigger"> The trigger. </param>
/// <param name="args"> A variable-length parameters list containing arguments. </param>
{
var representativeState = GetRepresentation(State);
representativeState.Activate();
Expand All @@ -214,15 +209,26 @@ public void Deactivate()
representativeState.Deactivate();
}

/// <summary>
/// Queue events and then fire in order.
/// If only one event is queued, this behaves identically to the non-queued version.
/// </summary>
/// <param name="trigger"> The trigger. </param>
/// <param name="args"> A variable-length parameters list containing arguments. </param>
void InternalFire(TTrigger trigger, params object[] args)
{
_eventQueue.Enqueue(new QueuedTrigger{Trigger = trigger, Args = args});
if (_firing)
{
_eventQueue.Enqueue(new QueuedTrigger { Trigger = trigger, Args = args });
return;
}

try
{
_firing = true;

InternalFireOne(trigger, args);

while (_eventQueue.Count != 0)
{
var queuedEvent = _eventQueue.Dequeue();
Expand Down

0 comments on commit cf5d354

Please sign in to comment.