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); }
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 }