示例#1
0
        /// <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);
 }
示例#3
0
        /// <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);
        }