Skip to content

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

Merged
WardenGnaw merged 4 commits into
mainfrom
dev/waan/2987836
Jul 16, 2026
Merged

Fix UI-thread hang when resuming the target during launch#1596
WardenGnaw merged 4 commits 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.

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 thread src/MIDebugEngine/Engine.Impl/OperationThread.cs
Comment thread src/MIDebugEngine/Engine.Impl/OperationThread.cs Outdated
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.
Address PR review: document that the ErrorHandler for an async operation may be invoked on a non-worker (task completion) thread, and invoke it while the running-op slot is still held so it does not run concurrently with the next queued operation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 0b5e2926-4bce-44b8-bfab-8b9b7f36a615
@WardenGnaw
WardenGnaw marked this pull request as ready for review July 15, 2026 00:00
Comment thread src/MIDebugEngine/Engine.Impl/OperationThread.cs
Comment thread src/MIDebugEngine/Engine.Impl/OperationThread.cs

@gregg-miskelly gregg-miskelly left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks good aside from the one suggestion

@gregg-miskelly

Copy link
Copy Markdown
Member
            }

Should probably drain the async operation queue also


Refers to: src/MIDebugEngine/Engine.Impl/OperationThread.cs:184 in d575ea9. [](commit_id = d575ea9, deletion_comment = False)

@gregg-miskelly gregg-miskelly left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Aside from Close, LGTM

@WardenGnaw

Copy link
Copy Markdown
Member Author

Had to also fix thie issue with Background actions are getting stuck waiting in the queue and may never running because thread went back to sleep.

@WardenGnaw

Copy link
Copy Markdown
Member Author

@microsoft-github-policy-service rerun

@WardenGnaw
WardenGnaw merged commit 2014d66 into main Jul 16, 2026
6 checks passed
@WardenGnaw
WardenGnaw deleted the dev/waan/2987836 branch July 16, 2026 16:21
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.

3 participants