public linkedListOperationExecutor(
     ExecutionSequenceParameters eParams,
     LinkedList <LinkedListItem> list)
 {
     state = new LinkedListExecutionState(list);
     state.AddToKnownNodes(list.First);
     state.AddToKnownNodes(list.Last);
     this.eParams = eParams;
 }
 public lfdllOperationExecutor(
     ExecutionSequenceParameters eParams,
     ILockFreeDoublyLinkedList <ListItemData> list, Counter counter,
     int name)
 {
     this.eParams = eParams;
     this.counter = counter;
     Name         = name;
     state        = new LfdllExecutionState(list);
     state.AddToKnownNodes(list.Head);
     state.AddingToKnownNodes(list.Tail);
 }
예제 #3
0
        public override void Main(string[] args)
        {
#if Verbose
            const bool verbose = true;
#else
            const bool verbose = false;
#endif

            int       operationSequencesNumber   = 3;
            const int operationNumberPerSequence = 4;
            const int listSize = 4;

            //Seed = 669052551;
            Random rand2 = new Random(Seed);

            TestIterationParameters iterationParameters =
                newIterationParameters(
                    listSize, operationSequencesNumber,
                    operationNumberPerSequence,
                    rand2);

#if Verbose
            Console.WriteLine("Test of LockFreeDoublyLinkedList");

            Console.WriteLine("Number of executors (Threads): " + operationSequencesNumber);
            Console.WriteLine("Operations per executor: "
                              + operationNumberPerSequence);
            Console.WriteLine("List size: " + listSize);

            Console.WriteLine("seed: " + Seed);

            Console.WriteLine("startIndex-es: "
                              + string.Join(" \t", iterationParameters.OperationSequences.Select(eParam => eParam.StartIndex)));

            Console.WriteLine("operations: ");
            for (int i = 0; i < iterationParameters.OperationSequences.Count; i++)
            {
                ExecutionSequenceParameters executionSequenceParameters
                    = iterationParameters.OperationSequences[i];
                Console.WriteLine("\t{0}", i);
                foreach (IOperationResultComparer op in executionSequenceParameters.Operations)
                {
                    Console.WriteLine("\t\t{0}", op);
                }
            }
#endif

#if SynchronizedLfdll
            Tuple <List <List <operationTiming> >, ILockFreeDoublyLinkedList <ListItemData> > lfdllResult
                = runOnLfdll(iterationParameters);
#else
            Tuple <List <List <operationTiming> >, ILockFreeDoublyLinkedList <ListItemData> > lfdllResult
                = runOnLfdll(iterationParameters);
#endif

            List <ListItemData> lfdllResultList = lfdllResult.Item2.ToList();

            List <operationExecutionInfo> timings
                = lfdllResult.Item1
                  .SelectMany((opTimings, i) => opTimings.Select(
                                  opTiming => new operationExecutionInfo(opTiming, i)))
                  .ToList();

            IEqualityComparer <ListItemData> equalityComparer
                = LinqHelper.ToEqualityComparer(
                      (ListItemData item1, ListItemData item2) =>
                      item1.NodeId == item2.NodeId &&
                      item1.Value == item2.Value,
                      item =>
                      (0x51ed270b + item.GetHashCode()) * -1521134295);

#if CheckCorrectness
            bool found =
                permutations(timings)
                .Select(
                    permTimings =>
                    runOnLinkedList(
                        iterationParameters,
                        permTimings.Select(oei => oei.ExecutorIndex)
                        .ToList()))
                .Any(
                    llResult =>
                    llResult.SequenceEqual(lfdllResultList, equalityComparer) &&
                    iterationParameters.OperationSequences.All(
                        os => os.Operations.All(o => o.LastResultsEqual)));
            // ReSharper disable once RedundantLogicalConditionalExpressionOperand
            if (verbose && found)
            {
                Console.WriteLine("Gefunden.");
            }
#pragma warning disable 162 // Unreachable code
            // ReSharper disable once ConditionIsAlwaysTrueOrFalse
            if (verbose || !found)
#pragma warning restore 162
            {
                Console.WriteLine("Test of LockFreeDoublyLinkedList");

                Console.WriteLine("Number of executors (Threads): " + operationSequencesNumber);
                Console.WriteLine("Operations per executor: "
                                  + operationNumberPerSequence);
                Console.WriteLine("List size: " + listSize);

                Console.WriteLine("seed: " + Seed);

                Random initializationRandom
                    = new Random(iterationParameters.InitializationSeed);
                Console.WriteLine("initial: \t"
                                  + string.Join(" \t", Enumerable.Range(0, listSize).Select(
                                                    i => new ListItemData(i, initializationRandom.Next(
                                                                              listItemValueRange)))));

                Console.WriteLine("lfdllResult: \t"
                                  + string.Join("\t",
                                                lfdllResultList.Select(o => o.ToString())));
                Console.WriteLine("linked list results: \t");
                var enumerationEqualityComparer = LinqHelper
                                                  .ToEqualityComparer <IEnumerable <ListItemData> >(
                    (e1, e2) =>
                {
                    var el1 = e1 as ListItemData[] ?? e1.ToArray();
                    var el2 = e2 as ListItemData[] ?? e2.ToArray();
                    return(el1.Length == el2.Length &&
                           el1.Zip(el2, (i1, i2) => i1.NodeId == i2.NodeId &&
                                   i1.Value == i2.Value)
                           .All(i => i));
                },
                    e1 => e1.Aggregate(
                        0x51ed270b,
                        (hash, next) => (hash + next.Value.GetHashCode()) * -1521134295));
                IEnumerable <IEnumerable <ListItemData> > perms
                    = permutations(timings)
                      .Select(
                          permTimings =>
                          runOnLinkedList(
                              iterationParameters,
                              permTimings.Select(oei => oei.ExecutorIndex)
                              .ToList()))
                      .Distinct(enumerationEqualityComparer);
                foreach (IEnumerable <ListItemData> sequentialResult
                         in perms)
                {
                    Console.WriteLine(string.Join("", sequentialResult.Select(value => " \t" + value)));
                }
                Console.WriteLine("startIndex-es: " + string.Join(" \t", iterationParameters.OperationSequences.Select(eParam => eParam.StartIndex)));
                Console.WriteLine("operations:");
                foreach (operationExecutionInfo timing in timings)
                {
                    Console.WriteLine("    " + timing.ExecutorIndex
                                      + " \t" + timing.Start
                                      + " \t" + timing.End
                                      + " \t" + timing.Operation
#if RunOperationsSequentially
                                      + " \t" + timing.Operation.LastResultsEqual
#endif
                                      );
                }
                if (!found)
                {
                    Console.Write("?");
                    Console.ReadLine();
                    throw new Exception();
                }
            }
#endif
        }