Skip to content

Fix UI-thread hang when resuming the target during launch#1596

Draft
WardenGnaw wants to merge 1 commit into
mainfrom
dev/waan/2987836
Draft

Fix UI-thread hang when resuming the target during launch#1596
WardenGnaw wants to merge 1 commit into
mainfrom
dev/waan/2987836

Conversation

@WardenGnaw

Copy link
Copy Markdown
Member

AD7Engine.ContinueFromSynchronousEvent (the AD7ProgramCreateEvent path) dispatched ResumeFromLaunch through the blocking WorkerThread.RunOperation, coupling the VS UI/SDM thread to debugger I/O. Over a slow or remote (SSH) transport, AD7Engine.ContinueFromSynchronousEvent + ResumeFromLaunch could stall for a long time or indefinitely, producing a Watson hang.

  • Add WorkerThread.PostAsyncOperation, a non-blocking dispatch that claims the running-op slot (so later AD7 operations still serialize behind it) but returns without waiting for completion. Faults from the operation are routed to an onError callback from both the synchronous and async completion paths.

  • ContinueFromSynchronousEvent now posts ResumeFromLaunch via PostAsyncOperation and returns S_OK immediately, so the UI thread is no longer blocked. Resume faults report through SendStartDebuggingError + Terminate via onError, and synchronous failures (OnLoadComplete or the dispatch itself) are still handled locally, since the SDM drops errors returned from this method.

  • Built and tested locally

    • Debugged through WSL Linux gdb and the async resume completed.

AD7Engine.ContinueFromSynchronousEvent (the AD7ProgramCreateEvent path)
dispatched ResumeFromLaunch through the blocking WorkerThread.RunOperation,
coupling the VS UI/SDM thread to debugger I/O. Over a slow or remote (SSH)
transport, AD7Engine.ContinueFromSynchronousEvent + ResumeFromLaunch could
stall for a long time or indefinitely, producing a Watson hang.

- Add WorkerThread.PostAsyncOperation, a non-blocking dispatch that claims the
  running-op slot (so later AD7 operations still serialize behind it) but
  returns without waiting for completion. Faults from the operation are routed
  to an onError callback from both the synchronous and async completion paths.
- ContinueFromSynchronousEvent now posts ResumeFromLaunch via PostAsyncOperation
  and returns S_OK immediately, so the UI thread is no longer blocked. Resume
  faults report through SendStartDebuggingError + Terminate via onError, and
  synchronous failures (OnLoadComplete or the dispatch itself) are still handled
  locally, since the SDM drops errors returned from this method.

- [x] Built and tested locally
  - [x] Debugged through WSL Linux gdb and the async resume completed.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses a Visual Studio UI/SDM-thread hang during launch by decoupling AD7Engine.ContinueFromSynchronousEvent (ProgramCreate path) from blocking debugger I/O, while still preserving operation serialization behind the worker thread’s “running-op” slot.

Changes:

  • Added WorkerThread.PostAsyncOperation to dispatch an AsyncOperation without blocking the caller while still claiming the running-op slot.
  • Routed AD7Engine.ContinueFromSynchronousEvent launch-resume (ResumeFromLaunch) through the new non-blocking dispatch so it can return S_OK immediately.
  • Added an error-handler pathway for PostAsyncOperation faults and surfaced them via an engine callback.
Show a summary per file
File Description
src/MIDebugEngine/Engine.Impl/OperationThread.cs Introduces PostAsyncOperation and error-handler plumbing for async operations.
src/MIDebugEngine/AD7.Impl/AD7Engine.cs Stops blocking the UI thread on ResumeFromLaunch by posting it asynchronously and handling failures via callback.

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 2
  • Review effort level: Low

Comment on lines +41 to +44
/// <summary>
/// Handler invoked on the worker thread if the operation faults. Only set for PostAsyncOperation.
/// </summary>
public Action<Exception> ErrorHandler;
Comment on lines +471 to +474
if (errorHandler != null && exceptionDispatchInfo != null)
{
InvokeErrorHandler(errorHandler, exceptionDispatchInfo.SourceException);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants