CmdPal: Avoid all-stripe locking in the adaptive icon cache - #49737
Merged
Mike Griese (zadjii-msft) merged 2 commits intoAug 7, 2026
Merged
Conversation
ConcurrentDictionary.Count and .Keys acquire all stripe locks, so cache maintenance could block the STA XAML thread and lead to WinUI fail-fast crash. - Replaces ConcurrentDictionary.Count checks with the approximate entry count. - Tracks cache entries atomically after successful additions and removals. - Enumerates the dictionary in Clear instead of snapshotting Keys. - Adds unit tests.
11 tasks
Jiří Polášek (jiripolasek)
marked this pull request as ready for review
August 7, 2026 13:17
Jiří Polášek (jiripolasek)
requested review from
Michael Jolley (michaeljolley) and
Mike Griese (zadjii-msft)
August 7, 2026 13:19
Mike Griese (zadjii-msft)
approved these changes
Aug 7, 2026
Mike Griese (zadjii-msft)
left a comment
Member
There was a problem hiding this comment.
seems reasonable
Mike Griese (zadjii-msft)
approved these changes
Aug 7, 2026
Mike Griese (zadjii-msft)
deleted the
dev/jpolasek/f/cmdpal-adaptive-cache-reentrancy
branch
August 7, 2026 17:40
Michael Jolley (michaeljolley)
added a commit
that referenced
this pull request
Aug 7, 2026
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request This PR is stacked on #49737 and separates in-flight icon loading from completed-result caching. The XAML request path no longer takes a provider-wide lock, while concurrent requests for the same icon still share a single task and completion cleanup can retire only that exact task generation. The loader now reports whether queue admission succeeded, preventing requests rejected during shutdown from remaining pending indefinitely. Overall, it seems that we got rid of a lock and actually reduced turnaround on UI thread. The separate in-flight tracking takes its tall, but overall throughput increased (tl;dr - it's faster). - Deduplicate outstanding icon loads in a dedicated in-flight dictionary. - Cache successful tasks before atomically retiring their in-flight entries. - Keep failed and rejected loads out of the adaptive cache so they can be retried. - Replace `EnqueueLoad` with `TryEnqueueLoad` and fault rejected requests. - Add tests for concurrent loading, publication ordering, failures, rejection, and retries. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary of the Pull Request
This PR removes all-stripe synchronization from
AdaptiveCache. UsingConcurrentDictionary.Countfor capacity checks andKeyswhile clearing could acquire every dictionary stripe, allowing XAML-bound icon cache operations to wait behind unrelated concurrent mutations.The main problem here is that WinUI doens't take locked main STA thread well and can fail-fast the app.
Keys.PR Checklist
Detailed Description of the Pull Request / Additional comments
Validation Steps Performed