Recover the video mirror from a WAIT_ABANDONED keyed mutex
SharedTextureSource::update() acquired the shared-texture keyed mutex with `AcquireSync(...) == S_OK`. But WAIT_ABANDONED -- a prior owner (e.g. a host that crashed mid-acquire, then reconnected) died holding it -- actually GRANTS us ownership. Treating it as failure skipped the copy AND never released, so the next AcquireSync blocked forever and the mirror froze permanently after a crash + reconnect (directly relevant to the new reconnect path). Factor the decision into keyed_mutex_acquired(HRESULT) (capture/keyed_mutex.hpp): S_OK or WAIT_ABANDONED -> copy + release; timeout/hard errors -> skip the frame. update() now uses it. Test-first: keyed_mutex_test asserts WAIT_ABANDONED is treated as acquired while the genuine "didn't get it" cases (timeout, E_FAIL, device-removed) are not. The full cross-process abandonment is keyed-mutex OS semantics, not re-tested with a child process here -- the predicate is the regression surface. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -113,10 +113,6 @@ default** and covers anything the hooked path doesn't.
|
||||
From an in-depth review pass. Each item is fixed test-first (a failing test, then the fix) and lands
|
||||
as its own commit; "verify" items are confirmed real before any change, and dropped if not.
|
||||
|
||||
Confirmed bugs:
|
||||
- **Keyed-mutex `WAIT_ABANDONED` not handled** — `shared_texture` treats it as "skip", so a mirror
|
||||
never recovers after a host crash + reconnect. Treat it as acquired (copy + release).
|
||||
|
||||
Correctness (verify, then fix if real):
|
||||
- **`vk_hook` / `vk_layer` `g_swaps`** — no synchronization on push/iterate and never pruned on
|
||||
swapchain destroy (unbounded growth + stale-handle match). Add a guard + a `vkDestroySwapchainKHR`
|
||||
|
||||
Reference in New Issue
Block a user