Beispiel #1
0
            private void Dispose()
            {
                ClearThreads();

                _parallelThreads           = _parallelThreads.DisposeExchange();
                _executionPathQueueBuilder = _executionPathQueueBuilder.DisposeExchange();
                _currentThread.Dispose(this);
                _currentThread    = Thread.Empty;
                _executionMethods = null;
                _partialRun       = false;

                Context.ProcessField = DummyProcess;
                Context = null;

                _processResources = null;
                _automata.ReleaseProcess(this);
            }
Beispiel #2
0
            internal void Initialize(IInstructionReader instructionReader, AutomataContext context)
            {
                if (ReferenceEquals(context.ProcessField, DummyProcess) == false)
                {
                    throw new InvalidOperationException("Context is busy");
                }

                _processResources          = ProcessResources.ThreadLocalInstance.Value;
                _executionPathQueueBuilder = _processResources.ExecutionPathGroupBuilderPool.Get().AddReference();
                _parallelThreads           = _processResources.ThreadListPool.Get().AddReference();
                _executionMethods          = _automata.GetExecutionMethods(context);

                Context = context;
                Context.ProcessField = this;

                var entryPoint = context.EntryPoint;

                if (!(entryPoint is FiniteState state))
                {
                    return;
                }

                var instructionQueue = _processResources.InstructionQueuePool.Get().Mount(instructionReader, _automata);

                _entryPointSubGraph = _automata.EnsureSubGraph(state);

                var initNode = _entryPointSubGraph.InitNode;

                if (initNode.Safe == false)
                {
                    initNode.MakeSafe();
                }

                _currentThread = new Thread(initNode, instructionQueue, context.CreateContextStateInternal())
                {
                    Stack                = _processResources.StackPool.Get().AddReference(),
                    ExecutionQueue       = _processResources.ExecutionPathPool.Get().AddReference(),
                    PredicateResultQueue = _processResources.PredicateResultPool.Get().AddReference()
                };
            }
 public ExecutionPathQueueBuilder(ExecutionPathGroupBuilder groupBuilder)
 {
     GroupBuilder = groupBuilder;
     ReturnPaths  = groupBuilder.ReturnPaths;
 }