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