| commit | 49ed2007e58f9b9175cbe196547c795c86223f9c | [log] [tgz] |
|---|---|---|
| author | Vyacheslav Egorov <vegorov@google.com> | Mon Aug 19 14:04:47 2024 +0000 |
| committer | Commit Queue <dart-scoped@luci-project-accounts.iam.gserviceaccount.com> | Mon Aug 19 14:04:47 2024 +0000 |
| tree | ca7c6778a8ad29803472f9914c40ab5dafac977d | |
| parent | 9685ee28dfbf601379cbdb74c6907161b08a251d [diff] |
[vm] Fix deadlock in `AllocateSuspendState` AllocateSuspendState was calling `Instance::SetField` but did not allow lazy deopt to occur. Possibility of lazy deopt from those field stores is only theoretical, but it manifested as a deadlock between background compiler and main thread: if main thread calls `SetField` which tries to acquire write access to the program lock, while background compiler has already acquired write access to the program lock and is trying to stop all mutators at a GC+Deopt safepoint then we will deadlock as `AllocateSuspendState` does not allow Deopts (safepoint level was lowered by 5bc107c29d297ac21fd4cb08192d2b3701ffb645). We fix this problem by bypassing field guard and simply writing affected fields directly in AllocateSuspendState. We make sure to initialize guarded state for these fields eagerly, so it never needs to change. TEST=added assertion which validates that attempting to acquire program lock for write can only occur where GC+Deopt are permitted. Change-Id: I6ee6b82f3296f49f799c0069e42850711c9320ac Bug: b/355226004 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/381240 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Slava Egorov <vegorov@google.com>
Dart is:
Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.
Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents in our repo at docs.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.
Future plans for Dart are included in the combined Dart and Flutter roadmap on the Flutter wiki.