dart-sdk/runtime/lib
Martin Kustermann 06b2967188 [vm] Disentagle PortMap/MessageHandler from port status tracking
The main purpose of the low-level [PortMap] is to coordinate between
ports being opened & closed and concurrent message senders. That's the
only thing it should do.

Each isolate owns [ReceivePort]s. Only the isolate mutator can create
ports, delete them or change their "keeps-isolate-alive" state. Right
now it requires going via [PortMap] (which acquires lock) and
[MessageHandler] (which acquires lock) to change the
"keeps-isolate-alive" state of a port.

We'll move information whether a dart [ReceivePort] is closed and
whether it keeps the isolate alive into the [ReceivePort] object itself.

=> Changing the "keeps-isolate-alive" state of the port no longer
requires any locks. We could even avoid the runtime call itself in a
future CL.

Isolates are kept alive if there's any open receive ports (that have not
been marked as "does not keep isolate alive"). This is a property of an
isolate not of the message handler. For native message handlers we do
have a 1<->1 correspondence between port and handler (i.e. there's no
"number of open ports" tracking needed).

=> We'll move the logic of counting open receive ports and ports that
keep the isolate alive to the [Isolate].
=> We'll also remove locking around incrementing/decrementing or
accessing the counts.
=> The [IsolateMessageHandler] will ask the [Isolate] whether there's
any open ports for determining whether to shut down.
=> For native ports, the `Dart_NewNativePort()` & `Dart_CloseNativePort()`
functions will manage the lifetime (as their name also suggests).

Overall this makes the [Isolate] responsible for creation of dart
[ReceivePort]s and tracking whether the isolate should be kept alive:
  * Isolate::CreateReceivePort()
  * Isolate::SetReceivePortKeepAliveState()
  * Isolate::CloseReceivePort()

TEST=ci

Change-Id: I847ae357c26254d3810cc277962e05deca18a1de
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/317960
Reviewed-by: Alexander Aprelev <aam@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
2023-08-08 10:57:47 +00:00
..
array.cc
async.cc [vm] Remove old async_debugger flag. 2023-06-27 07:18:50 +00:00
async_sources.gni
bool.cc
convert_sources.gni
core_sources.gni
date.cc
developer.cc [dart:developer] Add static Service.getObjectId method 2023-08-04 14:18:38 +00:00
developer_sources.gni
double.cc
errors.cc
ffi.cc [vm] Async FFI callbacks 2023-06-28 01:00:18 +00:00
ffi_dynamic_library.cc
ffi_sources.gni
function.cc
growable_array.cc
identical.cc
integers.cc
integers.h
invocation_mirror.h
isolate.cc [vm] Disentagle PortMap/MessageHandler from port status tracking 2023-08-08 10:57:47 +00:00
isolate_sources.gni
libgen_in.cc
math.cc
math_sources.gni
mirrors.cc [vm] Cleanup [PatchClass] in the VM 2023-06-29 15:03:37 +00:00
mirrors.h
mirrors_sources.gni
object.cc
profiler.cc
profiler_sources.gni
regexp.cc
simd128.cc
stacktrace.cc [vm] Rework awaiter stack unwinding. 2023-06-30 14:03:03 +00:00
stacktrace.h
stopwatch.cc
string.cc
timeline.cc
typed_data.cc
typed_data_sources.gni
uri.cc
vmservice.cc [vm] Disentagle PortMap/MessageHandler from port status tracking 2023-08-08 10:57:47 +00:00
vmservice_sources.gni