Revert "[vm] Implement `Finalizer`" This reverts commit 7dca34c23535287593595a3f570a714465556210. Reason for revert: b/226085355 dart_vm_test crashing. Unclear what the cause is. Reverting so we can triage the issue. TEST=This is a revert. Original change's description: > [vm] Implement `Finalizer` > > This CL implements the `Finalizer` in the GC. > > (This CL does not yet implement `NativeFinalizer`.) > > The GC is specially aware of two types of objects for the purposes of > running finalizers. > > 1) `FinalizerEntry` > 2) `Finalizer` (`FinalizerBase`, `_FinalizerImpl`) > > A `FinalizerEntry` contains the `value`, the optional `detach` key, and > the `token`, and a reference to the `finalizer`. > An entry only holds on weakly to the value, detach key, and finalizer. > (Similar to how `WeakReference` only holds on weakly to target). > > A `Finalizer` contains all entries, a list of entries of which the value > is collected, and a reference to the isolate. > > When a the value of an entry is GCed, the enry is added over to the > collected list. > If any entry is moved to the collected list, a message is sent that > invokes the finalizer to call the callback on all entries in that list. > > When a finalizer is detached by the user, the entry token is set to the > entry itself and is removed from the all entries set. > This ensures that if the entry was already moved to the collected list, > the finalizer is not executed. > > To speed up detaching, we use a weak map from detach keys to list of > entries. This ensures entries can be GCed. > > Both the scavenger and marker tasks process finalizer entries in > parallel. > Parallel tasks use an atomic exchange on the head of the collected > entries list, ensuring no entries get lost. > The mutator thread is guaranteed to be stopped when processing entries. > This ensures that we do not need barriers for moving entries into the > finalizers collected list. > Dart reads and replaces the collected entries list also with an atomic > exchange, ensuring the GC doesn't run in between a load/store. > > When a finalizer gets posted a message to process finalized objects, it > is being kept alive by the message. > An alternative design would be to pre-allocate a `WeakReference` in the > finalizer pointing to the finalizer, and send that itself. > This would be at the cost of an extra object. > > Send and exit is not supported in this CL, support will be added in a > follow up CL. Trying to send will throw. > > Bug: https://github.com/dart-lang/sdk/issues/47777 > > TEST=runtime/tests/vm/dart/finalizer/* > TEST=runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart > TEST=runtime/vm/object_test.cc > > Change-Id: I03e6b4a46212316254bf46ba3f2df333abaa686c > Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-ffi-android-debug-arm64c-try,dart-sdk-mac-arm64-try,vm-kernel-mac-release-arm64-try,pkg-mac-release-arm64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try,vm-kernel-win-debug-x64c-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-nnbd-win-release-ia32-try,vm-ffi-android-debug-arm-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,benchmark-linux-try,flutter-analyze-try,flutter-frontend-try,pkg-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/229544 > Reviewed-by: Lasse Nielsen <lrn@google.com> > Reviewed-by: Slava Egorov <vegorov@google.com> > Reviewed-by: Martin Kustermann <kustermann@google.com> > Reviewed-by: Ryan Macnak <rmacnak@google.com> > Commit-Queue: Daco Harkes <dacoharkes@google.com> TBR=lrn@google.com,vegorov@google.com,kustermann@google.com,rmacnak@google.com,dacoharkes@google.com Change-Id: I991f6e49896d18a8d70210cf315d858b462d66c9 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: https://github.com/dart-lang/sdk/issues/47777 Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-ffi-android-debug-arm64c-try,dart-sdk-mac-arm64-try,vm-kernel-mac-release-arm64-try,pkg-mac-release-arm64-try,vm-kernel-precomp-nnbd-mac-release-arm64-try,vm-kernel-win-debug-x64c-try,vm-kernel-win-debug-x64-try,vm-kernel-precomp-win-debug-x64c-try,vm-kernel-nnbd-win-release-ia32-try,vm-ffi-android-debug-arm-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,benchmark-linux-try,flutter-analyze-try,flutter-frontend-try,pkg-linux-debug-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64c-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238080 Reviewed-by: Slava Egorov <vegorov@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
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 on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.