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();
 }
Beispiel #2
0
            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);
            }
Beispiel #3
0
            internal PredicateResult DequePredicateResult()
            {
                if (_predicateResultQueue.Queue.Count == 0)
                {
                    _predicateResultQueue = _predicateResultQueue.Next;
                }

                if (_predicateResultQueue == null)
                {
                    throw new InvalidOperationException();
                }

                var result = _predicateResultQueue.Queue.Dequeue();

                return(result);
            }