public void Mount(ref Thread thread) { Stack = thread.Stack.AddReference(); ExecutionQueue = thread.ExecutionQueue.AddReference(); PredicateResultQueue = thread.PredicateResultQueue?.AddReference() ?? thread.Parent?.PredicateResultQueue?.AddReference(); Parent = thread.Parent?.AddReference(); }
private void ExecuteThread() { var thread = _currentThread; _currentThread = _mainThread; _mainThread = Thread.Empty; var instructionQueue = thread.InstructionStream; thread.InstructionStream = _currentThread.InstructionStream; _currentThread.InstructionStream = instructionQueue; var currentParent = thread.Parent; var executionQueue = thread.ExecutionQueue; _predicateResultQueue = thread.PredicateResultQueue; while (currentParent != null) { if (currentParent.PredicateResultQueue != null && ReferenceEquals(_predicateResultQueue, currentParent.PredicateResultQueue) == false) { currentParent.PredicateResultQueue.Next = _predicateResultQueue; _predicateResultQueue = currentParent.PredicateResultQueue; } currentParent.ExecutionQueue.Next = executionQueue; executionQueue = currentParent.ExecutionQueue; currentParent = currentParent.Parent; } ExecuteThreadQueue = true; while (executionQueue != null) { var executionQueueList = executionQueue.List; // ReSharper disable once ForCanBeConvertedToForeach for (var i = 0; i < executionQueueList.Count; i++) { ExecuteMain(executionQueueList[i]); } executionQueue = executionQueue.Next; } ExecuteThreadQueue = false; _predicateResultQueue = null; thread.Dispose(this); }
internal PredicateResult DequePredicateResult() { if (_predicateResultQueue.Queue.Count == 0) { _predicateResultQueue = _predicateResultQueue.Next; } if (_predicateResultQueue == null) { throw new InvalidOperationException(); } var result = _predicateResultQueue.Queue.Dequeue(); return(result); }