-
Notifications
You must be signed in to change notification settings - Fork 6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Impeller] Fix a race that can abort the process if the Vulkan context is destroyed while pipeline creation tasks are pending #50883
[Impeller] Fix a race that can abort the process if the Vulkan context is destroyed while pipeline creation tasks are pending #50883
Conversation
…t is destroyed while pipeline creation tasks are pending The Vulkan pipeline library queues pipeline creation tasks to a ConcurrentTaskRunner. If the ContextVK is destroyed before these tasks execute, then the ConcurrentMessageLoop destructor will delete the pending tasks. Each task lambda holds a reference to a promise that will be completed with the pipeline. If the task was never run and its promise was never completed, then the promise destructor will complete it with an exception. This will cause a std::abort because Flutter is built without exception support. This PR wraps the promise in an object that completes it with a default value during destruction if the promise was never given a value.
impeller/base/promise.h
Outdated
// By default the std::promise destructor will complete an empty promise with an | ||
// exception. This will fail because Flutter is built without exception support. | ||
template <typename T> | ||
class PromiseDestructWrapper { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm trying to think of a more descriptive name for this but coming up blank. NoExceptionPromise
, EmptyFulfillingPromise
? I guess this is fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Renamed it to NoExceptionPromise
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…kan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883)
…144208) flutter/engine@04ff286...0bc21ea 2024-02-27 [email protected] Respect SIGINT (Ctrl-C) for Android scenario_app. (flutter/engine#50989) 2024-02-27 [email protected] Roll Skia from aa28c3a30a98 to 2f2a718b27f7 (1 revision) (flutter/engine#50998) 2024-02-27 [email protected] Roll Dart SDK from 2876f5684ced to 67b2a250747b (1 revision) (flutter/engine#50996) 2024-02-27 [email protected] Fix usage of `--out-dir` with a relative path. (flutter/engine#50992) 2024-02-27 [email protected] Roll buildroot to 21b1b9f2645fada701885108e86aefbcb3b1cca0 (flutter/engine#50991) 2024-02-27 [email protected] Roll Skia from ba3ed5998af3 to aa28c3a30a98 (12 revisions) (flutter/engine#50994) 2024-02-27 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Migrate Android `scenario_app` to the `SurfaceProducer` API (#50993)" (flutter/engine#50995) 2024-02-27 [email protected] Migrate Android `scenario_app` to the `SurfaceProducer` API (flutter/engine#50993) 2024-02-27 [email protected] Revert "Reland 4: Multiview pipeline (#50931)" (flutter/engine#50985) 2024-02-26 [email protected] Refactor args parsing/environment constructor for `scenario_app` (flutter/engine#50980) 2024-02-26 [email protected] [scenario] trigger firstFrameLatch on exception. (flutter/engine#50981) 2024-02-26 [email protected] [Impeller] Fix a misspelling and name mismatch in a shader test fixture (flutter/engine#50983) 2024-02-26 [email protected] Roll Dart SDK from c479735adcf9 to 2876f5684ced (2 revisions) (flutter/engine#50979) 2024-02-26 [email protected] Run engine unit tests on mac host_debug_unopt_arm64 (flutter/engine#50327) 2024-02-26 [email protected] [Impeller] disble render pass caches. (flutter/engine#50976) 2024-02-26 [email protected] Update Surface reference after resizing render target in VirtualDisplay based platform views (flutter/engine#50971) 2024-02-26 [email protected] [Impeller] Fix a race that can abort the process if the Vulkan context is destroyed while pipeline creation tasks are pending (flutter/engine#50883) 2024-02-26 [email protected] Better filtering for Android `scenario_app` runner. (flutter/engine#50937) 2024-02-26 [email protected] Make sure to call `setHeightOverride` as well on TextStyle and StrutStyle (flutter/engine#50920) 2024-02-26 [email protected] Correctly offset the cull rect of the opacity layer. (flutter/engine#50928) 2024-02-26 [email protected] Roll Fuchsia Linux SDK from kLvCWEgbL1VTRW69e... to JCdhkDSFXzHyPuP4I... (flutter/engine#50970) Also rolling transitive DEPS: fuchsia/sdk/core/linux-amd64 from kLvCWEgbL1VT to JCdhkDSFXzHy If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
The Vulkan pipeline library queues pipeline creation tasks to a ConcurrentTaskRunner. If the ContextVK is destroyed before these tasks execute, then the ConcurrentMessageLoop destructor will delete the pending tasks.
Each task lambda holds a reference to a promise that will be completed with the pipeline. If the task was never run and its promise was never completed, then the promise destructor will complete it with an exception. This will cause a std::abort because Flutter is built without exception support.
This PR wraps the promise in an object that completes it with a default value during destruction if the promise was never given a value.