/// <summary> /// Get SCC from queue to check fairness /// </summary> /// <param name="o"></param> public void FairChecking(object o) { int order = (int)o; while (!isGlobalStop) { if (isProducerStop[order] && queueSCCArray[order].Count == 0) { return; } while (queueSCCArray[order].Count > 0) { SCC currentSCC = null; queueSCCArray[order].TryDequeue(out currentSCC); Dictionary <string, LocalPair> fairSCC = IsFair(currentSCC.component, currentSCC.transitionTable); if (fairSCC != null) { lock (globalCounterExampleLocker) { if (isGlobalStop) { return; } finalTrace = currentSCC.trace; finalLoopIndex = currentSCC.loopIndex; isGlobalStop = true; } } } } }
/// <summary> /// Enqueue SCC /// </summary> /// <param name="newSCC"></param> /// <param name="outgoingTransitionTable"></param> /// <param name="postTrace"></param> /// <param name="localCallStack"></param> /// <param name="isDeadLock"></param> public void enqueueSCC(int order, Dictionary<string, LocalPair> component, Dictionary<string, List<string>> outgoingTransitionTable, List<ConfigurationBase> postTrace, Stack<LocalPair> localCallStack, bool isDeadLock) { List<ConfigurationBase> preTrace = new List<ConfigurationBase>(localCallStack.Count); LocalPair[] localCallArray = localCallStack.ToArray(); for (int i = 1; i <localCallArray.Length; i++) { preTrace.Insert(0, localCallArray[i].configuration); if (localCallArray[i].configuration.Event == Constants.INITIAL_EVENT) { break; } } int loopIndex = isDeadLock ? -1 : preTrace.Count; preTrace.AddRange(postTrace); SCC newSCC = new SCC(component, outgoingTransitionTable, preTrace, loopIndex); queueSCCArray[order].Enqueue(newSCC); }
/// <summary> /// Enqueue SCC /// </summary> /// <param name="newSCC"></param> /// <param name="outgoingTransitionTable"></param> /// <param name="postTrace"></param> /// <param name="localCallStack"></param> /// <param name="isDeadLock"></param> public void enqueueSCC(int order, Dictionary <string, LocalPair> component, Dictionary <string, List <string> > outgoingTransitionTable, List <ConfigurationBase> postTrace, Stack <LocalPair> localCallStack, bool isDeadLock) { List <ConfigurationBase> preTrace = new List <ConfigurationBase>(localCallStack.Count); LocalPair[] localCallArray = localCallStack.ToArray(); for (int i = 1; i < localCallArray.Length; i++) { preTrace.Insert(0, localCallArray[i].configuration); if (localCallArray[i].configuration.Event == Constants.INITIAL_EVENT) { break; } } int loopIndex = isDeadLock ? -1 : preTrace.Count; preTrace.AddRange(postTrace); SCC newSCC = new SCC(component, outgoingTransitionTable, preTrace, loopIndex); queueSCCArray[order].Enqueue(newSCC); }