Пример #1
0
        //Return Task Set after loading from
        //File is formatted like
        //0     T1
        //1     T1
        //2     T2
        //...
        public CTaskExecutionTrace ParseTaskExecutionTrace(string
                                                           FileContents)
        {
            string[] sArray, sArray_1;

            long  time;
            CTask task;
            CTaskExecutionTrace et = new CTaskExecutionTrace();

            try
            {
                sArray = FileContents.Split('\n');

                foreach (string s in sArray)
                {
                    sArray_1 = s.Split('\t');
                    time     = Convert.ToInt32(sArray_1[0]);
                    task     = new CTask(sArray_1[1], 0, 0, 0, 0, 0);
                    et.Add(time, task);
                }
                return(et);
            }
            catch (Exception e)
            {
                _message = e.Message;
                return(null);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="L"></param>
        /// <returns></returns>
        private long findResponseTime(SortedList eventSet, int priorityOfEvent, long L)
        {
            ArrayList  Q = new ArrayList();
            SortedList G = new SortedList();

            //Reverse Priority Order, Such that task with lowest Priority is at index 0
            long  t;
            int   ii;
            int   Gap = 0;
            int   Ci = 0;
            int   retVal, lowestPriorityIndex;
            CTask hPriority, tmpE;
            int   stepsInternal;

            long currentTime;
            int  noOfInterferencesLowestPriority;


            if (priorityOfEvent > 0)
            {
                lowestPriorityIndex = priorityOfEvent;
            }
            else
            {
                lowestPriorityIndex = 0;
            }



            //Add all higher priority events
            for (ii = getIndexofHighestPriority(eventSet); ii > getIndex(lowestPriorityIndex); ii--)
            {
                tmpE = (CTask)eventSet[ii];
                tmpE.dExecutedSteps = 0; //Important to do this
                G.Add(tmpE.iPriority, tmpE);
            }

            if (priorityOfEvent > 0) //Lowest priority can be 1
            {
                tmpE = (CTask)eventSet[priorityOfEvent];
                Ci   = (int)tmpE.ExecutionTime;
            }
            else
            {
                Ci = -1;
            }


            _stepsTotal = 0;
            noOfInterferencesLowestPriority = 0;
            _interferenceCount = 0;


            for (t = 0; t < L; t++)
            {
                _lastDiscreteTimeValue = t;
                System.Windows.Forms.Application.DoEvents();


                currentTime = t; //Maintain Current Time
                retVal      = putEventInQ(t, G, Q);
                if (retVal < 0)
                {
                    return(retVal);
                }

                _stepsTotal++;

                //Execute task in Queue
                if (Q.Count > 0)
                {
                    hPriority     = (CTask)Q[Q.Count - 1]; // Last task
                    stepsInternal = 0;
                    foreach (CTask T in Q)
                    {
                        stepsInternal++;
                        if (T.iPriority >= hPriority.iPriority)
                        {
                            hPriority = T;
                        }
                    }
                    if (stepsInternal == 0)
                    {
                        _stepsTotal++;
                    }
                    else
                    {
                        _stepsTotal += stepsInternal;
                    }

                    if (Gap > 0)
                    {
                        noOfInterferencesLowestPriority++;
                        _interferenceCount++;
                    }
                    Gap = 0;

                    //Execute task hPriority
                    hPriority.dExecutedSteps++;
                    if (hPriority.dExecutedSteps == hPriority.ExecutionTime)
                    {
                        Q.Remove(hPriority);
                        hPriority.dExecutedSteps = 0;
                    }



                    _executionTrace.Add(t, hPriority);

                    //Reset all other executed steps to 0
                    stepsInternal = 0;
                    foreach (CTask T in Q)
                    {
                        stepsInternal++;
                        if (T.iPriority != hPriority.iPriority)
                        {
                            if (T.dExecutedSteps > 0)
                            {
                                _interferenceCount++;
                            }
                            //T.dExecutedSteps = 0; //Dont do this for Preemptive
                        }
                    }
                    if (stepsInternal == 0)
                    {
                        _stepsTotal++;
                    }
                    else
                    {
                        _stepsTotal += stepsInternal;
                    }
                }
                else
                {
                    Gap++;
                    _executionTrace.Add(t, null);
                    if (Gap == Ci)     // && t >= Ci * G.Count) //Gap found
                    {
                        return(t + 1); //If Ci is -ve this will never be reached
                    }
                }
            }
            if (priorityOfEvent > 0)
            {
                return(-1);                     //No gap was found
            }
            else
            {
                return(0); // All events were schedulable
            }
        }