You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 1c57db0
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: .github/workflows/just_build_no_signature.yml
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -133,7 +133,7 @@ jobs:
133
133
& $env:ComSpec /d /c $command
134
134
if ($LASTEXITCODE) { throw "Compatibility guard test failed: $name" }
135
135
}
136
-
foreach ($script in @('test_shutdown_routing.py','test_provider_publication_routes.py','test_provider_dll_boundary.py','test_combo_release.py','test_combo_shutdown.py','test_native_operation_routes.py','test_native_module_publication.py','test_native_init_scopes.py','test_ngx_init_paths.py','test_ngx_init_metadata.py','test_provider_release_admission.py','test_provider_call_admission.py','test_provider_init_footprint.py','test_provider_handle_api.py','test_upstream_resource_guards.py','test_provider_settings.py')) {
136
+
foreach ($script in @('test_shutdown_routing.py','test_provider_publication_routes.py','test_provider_dll_boundary.py','test_combo_release.py','test_combo_shutdown.py','test_native_operation_routes.py','test_native_module_publication.py','test_native_init_scopes.py','test_ngx_init_paths.py','test_ngx_init_metadata.py','test_provider_release_admission.py','test_provider_call_admission.py','test_provider_init_footprint.py','test_provider_handle_api.py','test_upstream_resource_guards.py','test_provider_settings.py','test_provider_shutdown_drain.py','test_ffx_release.py')) {
# Provider feature drain before parent shutdown — 2026-09-26
2
+
3
+
## Defects and policy
4
+
5
+
Parent Shutdown previously ignored the registry of outstanding replacement FG handles. DLL providers could destroy their contexts while a public token remained readable; FFX's parent Shutdown is a no-op, so merely retiring that token would leak its feature context and owned D3D12 device reference. Combo can retain one child after a failed Release, requiring retry before either parent is closed.
6
+
7
+
Normal shutdown now acquires the existing exclusive provider transition admission, selects live features for the requested API/device, calls their actual provider ReleaseFeature, and retires each public token only on success. Only after the drain succeeds does it enter the existing native/provider shutdown callback and local cleanup. No registry lock is held while calling provider/native code. Successful releases remain retired if a later release or parent shutdown fails; retry skips them. Failed releases and exceptions retain ownership and do not proceed to parent close. This is a partial-progress transaction, not a rollback that recreates released features.
8
+
9
+
Identity tokens remain retained until DLL unload, so successful Shutdown followed by Init cannot resurrect a previously drained token through address reuse. This closes that specific stale-handle path; repeated Init without a preceding successful close remains separate work.
10
+
11
+
## Device identity and conservative boundaries
12
+
13
+
- D3D12 Create obtains its device from the actual command list, with a temporary COM owner spanning creation/publication. Null command lists, failed GetDevice and null returned device are rejected with an empty output. Stored identity is immutable and non-owning; it is only compared, never dereferenced for cleanup.
14
+
- Vulkan CreateFeature1 records its explicit device and rejects null. Legacy Vulkan CreateFeature has no device argument and remains explicitly unknown; mutable global vkDevice is not used to guess.
15
+
- Device-specific shutdown with any matching-API unknown-device live token returns NotInitialized before releasing anything. The caller can release that token explicitly or request global shutdown. Global shutdown can drain unknown-device tokens of its API safely through their provider; it does not drain the other API.
16
+
- Once DLL_PROCESS_DETACH has set isShuttingDown, live-feature drain is rejected before entering GPU/provider destruction under a possible loader lock. No successful cleanup is claimed. This does not redesign the DLL's other existing detach behavior.
17
+
- ReleaseFeature's existing provider/driver contract still applies: CPU exclusion is not a GPU fence or proof that submitted work has finished. No real GPU tests were performed, per user instruction.
18
+
19
+
## FFX feature cleanup repair
20
+
21
+
FFX Release previously dropped its device reference before deleting the wrapper whose destructor destroys the context. It also discarded context destruction failures in the destructor while reporting successful Release. Release now explicitly destroys the context while the owned device reference is alive. Error/exception retains the wrapper/reference for retry; Evaluate rejects a wrapper whose release has started. Successful destruction clears the context before resetting the holder, preventing double destruction, then releases the device and deletes the wrapper. If the SDK clears the context even while returning failure, retry does not call DestroyContext on null.
22
+
23
+
This covers the normal explicit Release path and the shutdown drain that uses it. It does not assert that every separate context-holder destructor elsewhere can recover from a destruction failure.
24
+
25
+
## Tests and source scope
26
+
27
+
- 39 new `test_provider_shutdown_drain.py` checks compile the actual Create/Release/drain/coordinator methods with production registry/admission and fake SDK/COM calls. They cover invalid command lists/devices, balanced temporary COM reference, device/API isolation, active-call exclusion, detach rejection, worker-thread reentry, failures/exceptions, partial-progress retry, parent failure, stale tokens after reinitialization and unknown legacy Vulkan identity. D3D12 HUD work after admission remains a stand-in.
28
+
- 22 new `test_ffx_release.py` checks compile the actual FFX holder/destructor, complete Release and Evaluate rejection prefix. Counted SDK/COM stand-ins check destruction order, absent contexts, error/exception retry and context cleared on error. No FFX GPU execution is simulated.
29
+
- Actual exported shutdown tests expand from 52 to 56 checks: failed drain reaches neither native close nor local cleanup and receives the exact requested device. Existing fixtures for unrelated routes model an empty successful drain; the new suite tests the actual drain.
- Three negative controls in temporary copied sources detect removal of device filtering, ignored drain failure, and premature device release. Production files are never mutated by those controls.
32
+
- The source extraction helper now tolerates whitespace in declarations because clang-format wraps the longer coordinator signatures. It still fails if the production declaration is absent.
33
+
34
+
## Remaining work and synchronization gate
35
+
36
+
Repeated Init while old features remain, native Init/global configuration transaction ordering, partial Create rollback, and concurrent ordinary Evaluate access to shared HUD/depth resources are not solved by this batch. A legacy Vulkan token without explicit device ownership intentionally constrains device-specific close. Preserve these boundaries in the next continuation; do not invent a device association or label CPU tests as game compatibility proof.
37
+
38
+
The user on 2026-09-26 authorizes direct synchronization to aurora when the code-validation gate is actually met, without a separate confirmation or synchronization notification. Real-game tests remain deferred. No Release is authorized. This checkpoint alone does not close the remaining boundaries above. Full Windows validation will be appended after Actions completes.
0 commit comments