protected int RandomBackTrackAndDelay(Stack<TraversalInfo> searchStack, int startPoint)
{
//back track the stack randomly to some point
var backtrackAt = ZingerUtilities.rand.Next(startPoint, searchStack.Count() + 1);
while (searchStack.Count() > backtrackAt)
{
searchStack.Pop();
}
//delay the schedule
var delayedState = searchStack.Peek().GetDelayedSuccessor();
if (delayedState == null)
{
return -1;
}
TerminalState terminal = delayedState as TerminalState;
if (terminal != null)
{
if (terminal.IsErroneousTI)
{
lock (SafetyErrors)
{
SafetyErrors.Add(delayedState.GenerateNonCompactTrace());
this.lastErrorFound = delayedState.ErrorCode;
}
if (ZingerConfiguration.StopOnError)
{
//Stop all tasks
CancelTokenZingExplorer.Cancel(true);
throw delayedState.Exception;
}
}
return -1;
}
//push it on stack
searchStack.Push(delayedState);
return searchStack.Count();
}