Beispiel #1
0
        public ConflictGraph DeepCopy()
        {
            ConflictGraph deepcopyConflictGraph = new ConflictGraph();

            foreach (var ele in this.cgMethods)
            {
                MethodAnalyzer newEle = new MethodAnalyzer(ele.methodName);
                newEle = ele.DeepCopy();
                deepcopyConflictGraph.cgMethods.Add(newEle);
            }

            deepcopyConflictGraph.systemMethod          = new List <string>(this.systemMethod);
            deepcopyConflictGraph.systemMethodConflicts = new List <List <string> >(this.systemMethodConflicts);

            deepcopyConflictGraph.progMethods = new List <string>(this.progMethods);

            deepcopyConflictGraph.cgSharedFields = new List <string>(this.cgSharedFields);

            deepcopyConflictGraph.nbRepairedDR = this.nbRepairedDR;
            deepcopyConflictGraph.nbMovedAwait = this.nbMovedAwait;

            deepcopyConflictGraph.isAsync = this.isAsync;

            deepcopyConflictGraph.syntaxTree  = this.syntaxTree;
            deepcopyConflictGraph.compilation = this.compilation;

            return(deepcopyConflictGraph);
        }
Beispiel #2
0
        public void FindConflictGraphs(ConflictGraph conflictGraph)
        {
            int skip = 0;

            ConflictGraph cpconflictGraph;

            cpconflictGraph = conflictGraph.DeepCopy();

            cpconflictGraph.nbRepairedDR = 0;
            cpconflictGraph.nbMovedAwait = 0;

            while (cpconflictGraph.MoveAwait(skip))
            {
                cpconflictGraph.RepairGraph();
                skip = skip + 1;
                //nbAllAsychronizations = nbAllAsychronizations + 1;
                //nbRepairedDataRaces = nbRepairedDataRaces + cpconflictGraph.nbRepairedDR;
                //allConflictGraphs.Add(cpconflictGraph);
                if (AddConflictGraph(cpconflictGraph))
                {
                    FindConflictGraphs(cpconflictGraph);
                }
                cpconflictGraph = conflictGraph.DeepCopy();
            }

            if (skip > nbMovableAwaits)
            {
                nbMovableAwaits = skip;
            }
        }
Beispiel #3
0
        public ConflictGraphs(string[] args)
        {
            allConflictGraphs = new List <ConflictGraph>();

            nbAsychronizations = 0;
            //nbAllAsychronizations = 0;
            nbRepairedDataRaces      = 0;
            nbMovableAwaits          = 0;
            nbMethods                = 0;
            nbInvocations            = 0;
            nbAsyncInvocations       = 0;
            nbPotentialMovableAwaits = 0;
            distanceAwaits           = 0;

            Setups();

            if (args.Length > 0)
            {
                ConflictGraph conflictGraph = new ConflictGraph();

                int iden = 0;

                if (args.Length > 1)
                {
                    try
                    {
                        iden = Int32.Parse(args[1]);
                        //Console.WriteLine($"The project Id is: '{iden}'");
                    }
                    catch (FormatException)
                    {
                        // Console.WriteLine($"Unable to parse '{args[1]}'");
                    }
                }

                conflictGraph.SetUp(args[0], iden, sysMethods, sysMethodsConflicts);

                nbMethods = conflictGraph.progMethods.Count;

                nbInvocations = conflictGraph.TotalNbInvocations();

                if (conflictGraph.isAsync)
                {
                    conflictGraph.DesynchronizeAsynchrony();
                    nbPotentialMovableAwaits = conflictGraph.NbPotentialMovableAwaits();
                    conflictGraph.RepairGraph();
                    distanceAwaits = conflictGraph.DistanceMovableAwaits();
                }
                else
                {
                    conflictGraph.Desynchronize();
                    nbPotentialMovableAwaits = conflictGraph.NbPotentialMovableAwaits();
                    conflictGraph.RepairGraph();
                    distanceAwaits = conflictGraph.DistanceMovableAwaits();
                }

                nbAsyncInvocations = conflictGraph.TotalAsyncNbInvocations();

                Debug.Assert(nbInvocations >= nbAsyncInvocations);

                //nbAllAsychronizations = nbAllAsychronizations + 1;

                gconflictGraph = conflictGraph.DeepCopy();

                nbRepairedDataRaces = nbRepairedDataRaces + gconflictGraph.nbRepairedDR;

                allConflictGraphs.Add(gconflictGraph);

                FindConflictGraphs(conflictGraph);

                nbAsychronizations = allConflictGraphs.Count;

                Debug.Assert(nbPotentialMovableAwaits >= nbMovableAwaits);
            }
        }
Beispiel #4
0
        public bool AddConflictGraph(ConflictGraph conflictGraph)
        {
            //int k = 0;
            bool equal = true;

            foreach (ConflictGraph cf in allConflictGraphs)
            {
                for (int i = 0; i < conflictGraph.cgMethods.Count(); i++)
                {
                    List <Tuple <Accesses, string, IOperation> > cp = new List <Tuple <Accesses, string, IOperation> >(conflictGraph.cgMethods[i].conflictUnit);

                    List <Tuple <Accesses, string, IOperation> > cp2 = new List <Tuple <Accesses, string, IOperation> >(cf.cgMethods[i].conflictUnit);

                    int index_await = 0;
                    foreach (Tuple <Accesses, string, IOperation> unit in cp)
                    {
                        if (unit.Item1 == Accesses.Await)
                        {
                            int index_invoc = -1;
                            for (int n = index_await; n > -1; n--)
                            {
                                if (cp[n].Item1 == Accesses.Invocation && cp[n].Item2 == unit.Item2)
                                {
                                    index_invoc = n;
                                    break;
                                }
                            }

                            int s = 0;
                            for (int j = index_invoc + 1; j < index_await; j++)
                            {
                                if (cp[j].Item1 == Accesses.Invocation ||
                                    (cp[j].Item1 == Accesses.Read) ||
                                    (cp[j].Item1 == Accesses.Write))
                                {
                                    s = s + 1;
                                }
                            }

                            int index_await2 = 0;
                            int s2           = 0;
                            foreach (Tuple <Accesses, string, IOperation> unit2 in cp2)
                            {
                                if (unit2.Item1 == Accesses.Await && unit2.Item2 == unit.Item2)
                                {
                                    int index_invoc2 = -1;
                                    for (int n = index_await; n > -1; n--)
                                    {
                                        if (cp2[n].Item1 == Accesses.Invocation && cp2[n].Item2 == unit2.Item2)
                                        {
                                            index_invoc2 = n;
                                            break;
                                        }
                                    }

                                    for (int j = index_invoc2 + 1; j < index_await2; j++)
                                    {
                                        if (cp2[j].Item1 == Accesses.Invocation ||
                                            (cp2[j].Item1 == Accesses.Read) ||
                                            (cp2[j].Item1 == Accesses.Write))
                                        {
                                            s2 = s2 + 1;
                                        }
                                    }
                                    continue;
                                }
                                index_await2 = index_await2 + 1;
                            }

                            if (s != s2)
                            {
                                equal = false;
                                continue;
                            }
                        }

                        if (equal == false)
                        {
                            continue;
                        }

                        index_await = index_await + 1;
                    }
                    if (equal == false)
                    {
                        continue;
                    }
                }

                if (equal == true)
                {
                    return(false);
                }

                equal = true;
            }
            nbRepairedDataRaces = nbRepairedDataRaces + conflictGraph.nbRepairedDR;
            allConflictGraphs.Add(conflictGraph);
            return(true);
        }