public async Task ProcessExecutionTraceAnalysis(IJsonRpcClient rpcClient, ExecutionTraceAnalysis traceAnalysis, bool expectingException) { // We don't have real threads here, only a unique execution context // per RPC callback (eth_call or eth_sendTransactions). // So just use a rolling ID for threads. int threadId = System.Threading.Interlocked.Increment(ref _threadIDCounter); // Create a thread state for this thread MeadowDebugAdapterThreadState threadState = new MeadowDebugAdapterThreadState(rpcClient, traceAnalysis, threadId, expectingException); // Acquire the semaphore for processing a trace. await _processTraceSemaphore.WaitAsync(); // Set the thread state in our lookup ThreadStates[threadId] = threadState; // If we're not exiting, step through our if (!Exiting) { // Send an event that our thread has exited. Protocol.SendEvent(new ThreadEvent(ThreadEvent.ReasonValue.Started, threadState.ThreadId)); // Continue our execution. ContinueExecution(threadState, DesiredControlFlow.Continue); // Lock execution is complete. await threadState.Semaphore.WaitAsync(); // Send an event that our thread has exited. Protocol.SendEvent(new ThreadEvent(ThreadEvent.ReasonValue.Exited, threadState.ThreadId)); } // Remove the thread from our lookup. ThreadStates.Remove(threadId, out _); // Unlink our data for our thread id. ReferenceContainer.UnlinkThreadId(threadId); // Release the semaphore for processing a trace. _processTraceSemaphore.Release(); }
public async Task ProcessExecutionTraceAnalysis(ExecutionTraceAnalysis traceAnalysis) { // Obtain our thread ID int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; // Create a thread state for this thread MeadowDebugAdapterThreadState threadState = new MeadowDebugAdapterThreadState(traceAnalysis, threadId); // Acquire the semaphore for processing a trace. await _processTraceSemaphore.WaitAsync(); // Set the thread state in our lookup ThreadStates[threadId] = threadState; // If we're not exiting, step through our if (!Exiting) { // Send an event that our thread has exited. Protocol.SendEvent(new ThreadEvent(ThreadEvent.ReasonValue.Started, threadState.ThreadId)); // Continue our execution. ContinueExecution(threadState, DesiredControlFlow.Continue); // Lock execution is complete. await threadState.Semaphore.WaitAsync(); // Send an event that our thread has exited. Protocol.SendEvent(new ThreadEvent(ThreadEvent.ReasonValue.Exited, threadState.ThreadId)); } // Remove the thread from our lookup. ThreadStates.Remove(threadId, out _); // Unlink our data for our thread id. ReferenceContainer.UnlinkThreadId(threadId); // Release the semaphore for processing a trace. _processTraceSemaphore.Release(); }