-
Notifications
You must be signed in to change notification settings - Fork 6k
Wire up custom event loop interop for the GLFW embedder. #9089
Wire up custom event loop interop for the GLFW embedder. #9089
Conversation
|
Fixes flutter/flutter#30730 |
stuartmorgan-g
left a comment
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.
Looks good overall, just some small comments (mostly style)
| const auto now = TaskTimePoint::clock::now(); | ||
| std::vector<FlutterTask> expired_tasks; | ||
|
|
||
| // Process exipred tasks. |
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 generally of the opinion that if something has a scope block and a comment, that's a strong indication that it should be a function :)
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.
Usually. But for locks and scoped traces, I prefer this. If this routine gets larger or needs to be be called from multiple paths, I'll move it.
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.
The function is doing three distinct things, and is 50+ lines long, so by common evaluations of whether a function is small, there's a pretty good argument that this is already "larger".
I'm not clear what advantage there is in not pulling out at least the two non-trivial, self-contained blocks into helpers. I'm not going to hold up the PR on this, but I'd like to understand the argument for not breaking this up.
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.
My reasons:
- The entire routine fits on one screen (I suppose this depends on font size and such, but I am willing to bet my setup is not particularly esoteric) and control flow follows the eye from top to bottom. That one routine that fits on one screen has 17 lines of comments and 19 lines of code. For a subjective argument about the size of the routine, I am confident in my argument about as much as you are in yours.
- There are very specific locking requirements around the tasks queue mutex. Say I were to split this into three routines. Looking at just the second routine in isolation, I wouldn't know if the caller is supposed to have already acquired the mutex (in which case the routine would have to manually unlock the same because it is a deadlock opportunity to flush tasks with the mutex acquired). This can be addressed by thread safety annotations which I could not use because of the undecorated
std::condition_variable, or, naming the routineFlushTaskNoLock(which I always found confusing because doesNoLockmean "don't lock" or "its not locked"?). Each has the described issues. - I question the assertion that the two (1st and 3rd) are non-trivial and self contained. The triviality is subjective I suppose, but I still need to use the same timepoint in both blocks. Splitting into its own routines would mean extra arguments to that routine for reasons not immediately clear (because making two syscalls would merely be a pessimization).
For these reasons, I assert that splitting this already trivial routine further for readability would be counterproductive. Again, all of this is subjective and if any of these blocks had become non-trivial (using subjective evaluations again), I am sure I would have split the same. I believe adding scopes for RAII or just to make sure variables don't escape the same do no automatically mean a that block must be helper.
|
|
||
| void GLFWEventLoop::PostTask(FlutterTask flutter_task, | ||
| uint64_t flutter_target_time_nanos) { | ||
| static std::atomic_uint64_t gGlobalTaskOrder(0); |
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've never seen 'g' used as a prefix for a local static; I would expect 's'.
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.
Line 17 in 215096c
| size_t TraceNonce() { |
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.
g comes from Hungarian notation and means "global". This doesn't have global scope, and I have a strong opinion that annotating something that's not a global as if it were is wrong :) Please use s, as I would find g actively confusing.
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.
Fair point. Updated. Will patch the other uses in the engine a separate patch.
e04aa88 to
6ff0367
Compare
|
when to fix windows cpu too high bug? |
0e13ba5 to
406a15e
Compare
|
Ok. This is good to go. |
stuartmorgan-g
left a comment
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.
LGTM with a few nits.
| "$flutter_root/shell/platform/linux/config:gtk3", | ||
| "$flutter_root/shell/platform/linux/config:x11", | ||
| ] | ||
| } else if (is_mac) { |
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.
This seems unrelated to the PR?
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.
This is necessary after --build-glfw-shell on Mac.
| const auto now = TaskTimePoint::clock::now(); | ||
| std::vector<FlutterTask> expired_tasks; | ||
|
|
||
| // Process exipred tasks. |
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.
The function is doing three distinct things, and is 50+ lines long, so by common evaluations of whether a function is small, there's a pretty good argument that this is already "larger".
I'm not clear what advantage there is in not pulling out at least the two non-trivial, self-contained blocks into helpers. I'm not going to hold up the PR on this, but I'd like to understand the argument for not breaking this up.
| } | ||
|
|
||
| // Fire expired tasks. | ||
| { |
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.
There's no scoped lock; why is there a scope block? (I would argue that the fact that you did this despite in not being any mechanical reason I can see is an indication that it should be broken into helpers.)
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.
Yeah, you are right. I wrote the comments first as pseudocode then filled it out with real code. As noted earlier, I don't think adding scopes means that the block should necessarily be extracted into its own helper routine.
| } | ||
|
|
||
| // Sleep till the next task needs to be processed. If a new task comes | ||
| // along, the wait in GLFW will be resolved early because we posted an empty |
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.
s/we posted/PostTask posts/
(go/avoidwe)
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.
Done.
|
|
||
| void GLFWEventLoop::PostTask(FlutterTask flutter_task, | ||
| uint64_t flutter_target_time_nanos) { | ||
| static std::atomic_uint64_t gGlobalTaskOrder(0); |
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.
g comes from Hungarian notation and means "global". This doesn't have global scope, and I have a strong opinion that annotating something that's not a global as if it were is wrong :) Please use s, as I would find g actively confusing.
406a15e to
7045e97
Compare
chinmaygarde
left a comment
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.
Addressed comments.
| "$flutter_root/shell/platform/linux/config:gtk3", | ||
| "$flutter_root/shell/platform/linux/config:x11", | ||
| ] | ||
| } else if (is_mac) { |
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.
This is necessary after --build-glfw-shell on Mac.
| const auto now = TaskTimePoint::clock::now(); | ||
| std::vector<FlutterTask> expired_tasks; | ||
|
|
||
| // Process exipred tasks. |
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.
My reasons:
- The entire routine fits on one screen (I suppose this depends on font size and such, but I am willing to bet my setup is not particularly esoteric) and control flow follows the eye from top to bottom. That one routine that fits on one screen has 17 lines of comments and 19 lines of code. For a subjective argument about the size of the routine, I am confident in my argument about as much as you are in yours.
- There are very specific locking requirements around the tasks queue mutex. Say I were to split this into three routines. Looking at just the second routine in isolation, I wouldn't know if the caller is supposed to have already acquired the mutex (in which case the routine would have to manually unlock the same because it is a deadlock opportunity to flush tasks with the mutex acquired). This can be addressed by thread safety annotations which I could not use because of the undecorated
std::condition_variable, or, naming the routineFlushTaskNoLock(which I always found confusing because doesNoLockmean "don't lock" or "its not locked"?). Each has the described issues. - I question the assertion that the two (1st and 3rd) are non-trivial and self contained. The triviality is subjective I suppose, but I still need to use the same timepoint in both blocks. Splitting into its own routines would mean extra arguments to that routine for reasons not immediately clear (because making two syscalls would merely be a pessimization).
For these reasons, I assert that splitting this already trivial routine further for readability would be counterproductive. Again, all of this is subjective and if any of these blocks had become non-trivial (using subjective evaluations again), I am sure I would have split the same. I believe adding scopes for RAII or just to make sure variables don't escape the same do no automatically mean a that block must be helper.
| } | ||
|
|
||
| // Fire expired tasks. | ||
| { |
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.
Yeah, you are right. I wrote the comments first as pseudocode then filled it out with real code. As noted earlier, I don't think adding scopes means that the block should necessarily be extracted into its own helper routine.
| } | ||
|
|
||
| // Sleep till the next task needs to be processed. If a new task comes | ||
| // along, the wait in GLFW will be resolved early because we posted an empty |
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.
Done.
|
|
||
| void GLFWEventLoop::PostTask(FlutterTask flutter_task, | ||
| uint64_t flutter_target_time_nanos) { | ||
| static std::atomic_uint64_t gGlobalTaskOrder(0); |
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.
Fair point. Updated. Will patch the other uses in the engine a separate patch.
351f49d to
b8a81e3
Compare
flutter/engine@ffba2f6...7d3e722 git log ffba2f6..7d3e722 --no-merges --oneline 7d3e722 Roll buildroot to c5a493b. (flutter/engine#9649) 8deeb77 make EmbeddedViewParams a unique ptr (flutter/engine#9640) 7862af5 Roll src/third_party/skia bd3d8d39b3e7..215ff3325230 (4 commits) (flutter/engine#9648) a9ee687 iOS PlatformView clip path (flutter/engine#9478) c19b53c Roll src/third_party/skia effee2065796..bd3d8d39b3e7 (1 commits) (flutter/engine#9647) aeaa5ed Roll src/third_party/skia 2ef826576819..effee2065796 (1 commits) (flutter/engine#9646) 1cc1f04 Roll src/third_party/skia f2c52efce52b..2ef826576819 (2 commits) (flutter/engine#9645) 1c295b2 Roll src/third_party/skia 9fb7fa537d93..f2c52efce52b (1 commits) (flutter/engine#9644) 56a3f41 Android Embedding Refactor PR31: Integrate platform views with the new embedding and the plugin shim. (flutter/engine#9206) 8ac7cbd Fix warning about settings unavailable GN arg build_glfw_shell (flutter/engine#9642) f665717 Roll src/third_party/skia 21a486d04ae0..9fb7fa537d93 (21 commits) (flutter/engine#9639) fd24007 Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (flutter/engine#9638) 628b174 Fixes a plugin overwrite bug in the plugin shim system. (flutter/engine#9589) 345d350 Added Doxyfile. (flutter/engine#9632) 64b9eef Revert "Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (#9634)" (flutter/engine#9637) 45e1ad2 Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (flutter/engine#9634) da6475e Roll fuchsia/sdk/core/mac-amd64 from TRwIGIJLuznLNQzJk17zfboJrkErpe1XvGr0njCwemoC to byM-kyxL4bemlTYNqhKUfJfZoIUrCSzS6XzsFr4n9-MC (flutter/engine#9629) bee12e6 Roll fuchsia/sdk/core/mac-amd64 from MBS_xxNZ_O32DxW1bhOeJisJqYG9JY_FAtSa3ZYupg4C to TRwIGIJLuznLNQzJk17zfboJrkErpe1XvGr0njCwemoC (flutter/engine#9626) fea8fa6 Roll fuchsia/sdk/core/linux-amd64 from Efv1uHDvhLYgT8mvQmdAiJv7HiLix2L_kDRkK6P9ER4C to I2Qe1zxgckzIzMBTztvzeWYsDgcb9Fw-idSI16oIlx8C (flutter/engine#9625) e7f8ca1 [all] add fuchsia.{net.NameLookup,posix.socket.Provider} (flutter/engine#9546) a72a999 Roll fuchsia/sdk/core/mac-amd64 from B-JzM_H7hG5kOIRFjmUqI3uWBAV7no8BnCTknbd2wQ4C to MBS_xxNZ_O32DxW1bhOeJisJqYG9JY_FAtSa3ZYupg4C (flutter/engine#9624) b3fe3e9 Fix a race in the embedder accessibility unit test (flutter/engine#9585) 55818f6 Roll fuchsia/sdk/core/linux-amd64 from xtoj1ola0unTQOetly-V77CgpT6g8L1JUKWDqS8SuAQC to Efv1uHDvhLYgT8mvQmdAiJv7HiLix2L_kDRkK6P9ER4C (flutter/engine#9623) 37a54f2 Roll fuchsia/sdk/core/linux-amd64 from O1niQGtIRghvjuMMCmxevRA1Y6seUn6onOao6Wii9hQC to xtoj1ola0unTQOetly-V77CgpT6g8L1JUKWDqS8SuAQC (flutter/engine#9622) 458a764 Roll fuchsia/sdk/core/mac-amd64 from neDu8hWotIrKCQkxz1ScSJC4NoBva1_YVszr6wMbcZQC to B-JzM_H7hG5kOIRFjmUqI3uWBAV7no8BnCTknbd2wQ4C (flutter/engine#9621) 6e7b4ca Roll fuchsia/sdk/core/linux-amd64 from gMVpYn1cxQ0LeU-TSryUCg2o3rNcf7JWvlOqY6G00MYC to O1niQGtIRghvjuMMCmxevRA1Y6seUn6onOao6Wii9hQC (flutter/engine#9620) e4d354d Roll src/third_party/skia 161f47dfbf6a..21a486d04ae0 (2 commits) (flutter/engine#9619) 2802875 Roll fuchsia/sdk/core/mac-amd64 from tPyg8rqV40gsoXEhDf7VskccnbJGCh4_bZp71YOUinEC to neDu8hWotIrKCQkxz1ScSJC4NoBva1_YVszr6wMbcZQC (flutter/engine#9618) 8e405c1 Roll fuchsia/sdk/core/mac-amd64 from UkCx2sMZsCM-w9nEuQC2TRfnJ7wjJCxsCxSDEx2uPegC to tPyg8rqV40gsoXEhDf7VskccnbJGCh4_bZp71YOUinEC (flutter/engine#9615) 609a980 Fix uninitialized variables and put tests in flutter namespace. (flutter/engine#9613) 9807894 Roll fuchsia/sdk/core/linux-amd64 from ur0ah3sh2atct83EqYX28SjG3fKt-7Driu48GbpdxmMC to gMVpYn1cxQ0LeU-TSryUCg2o3rNcf7JWvlOqY6G00MYC (flutter/engine#9612) 4e344e6 Wire up custom event loop interop for the GLFW embedder. (flutter/engine#9089) 54c6226 Roll fuchsia/sdk/core/mac-amd64 from gyWAjP3BPfhpvHOOwaTusfA8JaGcY_UzjpoIGQnA_W0C to UkCx2sMZsCM-w9nEuQC2TRfnJ7wjJCxsCxSDEx2uPegC (flutter/engine#9611) c3f8cab Roll fuchsia/sdk/core/linux-amd64 from xmxDtsnD0sfj7wxUaiMMhUwh72prBvMcYHY07lgTotcC to ur0ah3sh2atct83EqYX28SjG3fKt-7Driu48GbpdxmMC (flutter/engine#9610) 6f1a748 Document various classes in //flutter/shell/common. (flutter/engine#9591) 4d36530 Roll fuchsia/sdk/core/mac-amd64 from 4PD6FCl4NvKCavA0AVsdKtZPB3G5K72KprkEH0mr064C to gyWAjP3BPfhpvHOOwaTusfA8JaGcY_UzjpoIGQnA_W0C (flutter/engine#9609) cf084bd Roll fuchsia/sdk/core/linux-amd64 from XRYatTY5OvCnQ-5rGC8AnYltKa68CBxmnEK8QO0fpvQC to xmxDtsnD0sfj7wxUaiMMhUwh72prBvMcYHY07lgTotcC (flutter/engine#9607) 8d05400 disable mysterious failing tests (flutter/engine#9608) aa817a9 Roll fuchsia/sdk/core/mac-amd64 from DeTFBSaxMBfZpfK0c7CifGpJbJLOrs3WtuCOaINwmrwC to 4PD6FCl4NvKCavA0AVsdKtZPB3G5K72KprkEH0mr064C (flutter/engine#9606) 4e988e0 Roll fuchsia/sdk/core/linux-amd64 from jXpdljb7CHe8PEpUGGYqGvx6vFar6QRUh6HmpxMoS9sC to XRYatTY5OvCnQ-5rGC8AnYltKa68CBxmnEK8QO0fpvQC (flutter/engine#9605) 84ae36a Roll fuchsia/sdk/core/mac-amd64 from IMr36r3rRLs1G7T5OtCudVMoWjPcjRbYGgyDg7LSxPwC to DeTFBSaxMBfZpfK0c7CifGpJbJLOrs3WtuCOaINwmrwC (flutter/engine#9604) 7135c8d Roll fuchsia/sdk/core/mac-amd64 from qcwCYvuT0PeU97HpvMVmC114EOKwfrk8PdFdZz_m6CIC to IMr36r3rRLs1G7T5OtCudVMoWjPcjRbYGgyDg7LSxPwC (flutter/engine#9602) 8f4df03 Roll fuchsia/sdk/core/linux-amd64 from Y3kUPtfq2frI60zx7VssO-WG733jtODCmnESyz0UGdEC to jXpdljb7CHe8PEpUGGYqGvx6vFar6QRUh6HmpxMoS9sC (flutter/engine#9601) 6c6a0d7 [trace clients] Remove fuchsia.tracelink.Registry (flutter/engine#9593) f931539 Roll fuchsia/sdk/core/mac-amd64 from UsrGfX7Fj96MljgqUFc_A-o_ufsa_FX3eaG14ZSDWMAC to qcwCYvuT0PeU97HpvMVmC114EOKwfrk8PdFdZz_m6CIC (flutter/engine#9600) ...
flutter/engine@ffba2f6...7d3e722 git log ffba2f6..7d3e722 --no-merges --oneline 7d3e722 Roll buildroot to c5a493b. (flutter/engine#9649) 8deeb77 make EmbeddedViewParams a unique ptr (flutter/engine#9640) 7862af5 Roll src/third_party/skia bd3d8d39b3e7..215ff3325230 (4 commits) (flutter/engine#9648) a9ee687 iOS PlatformView clip path (flutter/engine#9478) c19b53c Roll src/third_party/skia effee2065796..bd3d8d39b3e7 (1 commits) (flutter/engine#9647) aeaa5ed Roll src/third_party/skia 2ef826576819..effee2065796 (1 commits) (flutter/engine#9646) 1cc1f04 Roll src/third_party/skia f2c52efce52b..2ef826576819 (2 commits) (flutter/engine#9645) 1c295b2 Roll src/third_party/skia 9fb7fa537d93..f2c52efce52b (1 commits) (flutter/engine#9644) 56a3f41 Android Embedding Refactor PR31: Integrate platform views with the new embedding and the plugin shim. (flutter/engine#9206) 8ac7cbd Fix warning about settings unavailable GN arg build_glfw_shell (flutter/engine#9642) f665717 Roll src/third_party/skia 21a486d04ae0..9fb7fa537d93 (21 commits) (flutter/engine#9639) fd24007 Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (flutter/engine#9638) 628b174 Fixes a plugin overwrite bug in the plugin shim system. (flutter/engine#9589) 345d350 Added Doxyfile. (flutter/engine#9632) 64b9eef Revert &flutter#34;Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (flutter#9634)&flutter#34; (flutter/engine#9637) 45e1ad2 Roll Dart to 67ab3be10d35d994641da167cc806f20a7ffa679 (flutter/engine#9634) da6475e Roll fuchsia/sdk/core/mac-amd64 from TRwIGIJLuznLNQzJk17zfboJrkErpe1XvGr0njCwemoC to byM-kyxL4bemlTYNqhKUfJfZoIUrCSzS6XzsFr4n9-MC (flutter/engine#9629) bee12e6 Roll fuchsia/sdk/core/mac-amd64 from MBS_xxNZ_O32DxW1bhOeJisJqYG9JY_FAtSa3ZYupg4C to TRwIGIJLuznLNQzJk17zfboJrkErpe1XvGr0njCwemoC (flutter/engine#9626) fea8fa6 Roll fuchsia/sdk/core/linux-amd64 from Efv1uHDvhLYgT8mvQmdAiJv7HiLix2L_kDRkK6P9ER4C to I2Qe1zxgckzIzMBTztvzeWYsDgcb9Fw-idSI16oIlx8C (flutter/engine#9625) e7f8ca1 [all] add fuchsia.{net.NameLookup,posix.socket.Provider} (flutter/engine#9546) a72a999 Roll fuchsia/sdk/core/mac-amd64 from B-JzM_H7hG5kOIRFjmUqI3uWBAV7no8BnCTknbd2wQ4C to MBS_xxNZ_O32DxW1bhOeJisJqYG9JY_FAtSa3ZYupg4C (flutter/engine#9624) b3fe3e9 Fix a race in the embedder accessibility unit test (flutter/engine#9585) 55818f6 Roll fuchsia/sdk/core/linux-amd64 from xtoj1ola0unTQOetly-V77CgpT6g8L1JUKWDqS8SuAQC to Efv1uHDvhLYgT8mvQmdAiJv7HiLix2L_kDRkK6P9ER4C (flutter/engine#9623) 37a54f2 Roll fuchsia/sdk/core/linux-amd64 from O1niQGtIRghvjuMMCmxevRA1Y6seUn6onOao6Wii9hQC to xtoj1ola0unTQOetly-V77CgpT6g8L1JUKWDqS8SuAQC (flutter/engine#9622) 458a764 Roll fuchsia/sdk/core/mac-amd64 from neDu8hWotIrKCQkxz1ScSJC4NoBva1_YVszr6wMbcZQC to B-JzM_H7hG5kOIRFjmUqI3uWBAV7no8BnCTknbd2wQ4C (flutter/engine#9621) 6e7b4ca Roll fuchsia/sdk/core/linux-amd64 from gMVpYn1cxQ0LeU-TSryUCg2o3rNcf7JWvlOqY6G00MYC to O1niQGtIRghvjuMMCmxevRA1Y6seUn6onOao6Wii9hQC (flutter/engine#9620) e4d354d Roll src/third_party/skia 161f47dfbf6a..21a486d04ae0 (2 commits) (flutter/engine#9619) 2802875 Roll fuchsia/sdk/core/mac-amd64 from tPyg8rqV40gsoXEhDf7VskccnbJGCh4_bZp71YOUinEC to neDu8hWotIrKCQkxz1ScSJC4NoBva1_YVszr6wMbcZQC (flutter/engine#9618) 8e405c1 Roll fuchsia/sdk/core/mac-amd64 from UkCx2sMZsCM-w9nEuQC2TRfnJ7wjJCxsCxSDEx2uPegC to tPyg8rqV40gsoXEhDf7VskccnbJGCh4_bZp71YOUinEC (flutter/engine#9615) 609a980 Fix uninitialized variables and put tests in flutter namespace. (flutter/engine#9613) 9807894 Roll fuchsia/sdk/core/linux-amd64 from ur0ah3sh2atct83EqYX28SjG3fKt-7Driu48GbpdxmMC to gMVpYn1cxQ0LeU-TSryUCg2o3rNcf7JWvlOqY6G00MYC (flutter/engine#9612) 4e344e6 Wire up custom event loop interop for the GLFW embedder. (flutter/engine#9089) 54c6226 Roll fuchsia/sdk/core/mac-amd64 from gyWAjP3BPfhpvHOOwaTusfA8JaGcY_UzjpoIGQnA_W0C to UkCx2sMZsCM-w9nEuQC2TRfnJ7wjJCxsCxSDEx2uPegC (flutter/engine#9611) c3f8cab Roll fuchsia/sdk/core/linux-amd64 from xmxDtsnD0sfj7wxUaiMMhUwh72prBvMcYHY07lgTotcC to ur0ah3sh2atct83EqYX28SjG3fKt-7Driu48GbpdxmMC (flutter/engine#9610) 6f1a748 Document various classes in //flutter/shell/common. (flutter/engine#9591) 4d36530 Roll fuchsia/sdk/core/mac-amd64 from 4PD6FCl4NvKCavA0AVsdKtZPB3G5K72KprkEH0mr064C to gyWAjP3BPfhpvHOOwaTusfA8JaGcY_UzjpoIGQnA_W0C (flutter/engine#9609) cf084bd Roll fuchsia/sdk/core/linux-amd64 from XRYatTY5OvCnQ-5rGC8AnYltKa68CBxmnEK8QO0fpvQC to xmxDtsnD0sfj7wxUaiMMhUwh72prBvMcYHY07lgTotcC (flutter/engine#9607) 8d05400 disable mysterious failing tests (flutter/engine#9608) aa817a9 Roll fuchsia/sdk/core/mac-amd64 from DeTFBSaxMBfZpfK0c7CifGpJbJLOrs3WtuCOaINwmrwC to 4PD6FCl4NvKCavA0AVsdKtZPB3G5K72KprkEH0mr064C (flutter/engine#9606) 4e988e0 Roll fuchsia/sdk/core/linux-amd64 from jXpdljb7CHe8PEpUGGYqGvx6vFar6QRUh6HmpxMoS9sC to XRYatTY5OvCnQ-5rGC8AnYltKa68CBxmnEK8QO0fpvQC (flutter/engine#9605) 84ae36a Roll fuchsia/sdk/core/mac-amd64 from IMr36r3rRLs1G7T5OtCudVMoWjPcjRbYGgyDg7LSxPwC to DeTFBSaxMBfZpfK0c7CifGpJbJLOrs3WtuCOaINwmrwC (flutter/engine#9604) 7135c8d Roll fuchsia/sdk/core/mac-amd64 from qcwCYvuT0PeU97HpvMVmC114EOKwfrk8PdFdZz_m6CIC to IMr36r3rRLs1G7T5OtCudVMoWjPcjRbYGgyDg7LSxPwC (flutter/engine#9602) 8f4df03 Roll fuchsia/sdk/core/linux-amd64 from Y3kUPtfq2frI60zx7VssO-WG733jtODCmnESyz0UGdEC to jXpdljb7CHe8PEpUGGYqGvx6vFar6QRUh6HmpxMoS9sC (flutter/engine#9601) 6c6a0d7 [trace clients] Remove fuchsia.tracelink.Registry (flutter/engine#9593) f931539 Roll fuchsia/sdk/core/mac-amd64 from UsrGfX7Fj96MljgqUFc_A-o_ufsa_FX3eaG14ZSDWMAC to qcwCYvuT0PeU97HpvMVmC114EOKwfrk8PdFdZz_m6CIC (flutter/engine#9600) ...
No description provided.