b2171f16f1
This reverts commit b75057b687.
Reason for revert: Caused some failures on app-jit builders
Original change's description:
> [vm/concurrency] Introduce concept of Isolate Groups
>
> An Isolate Group (IG) is a collection of isolates which were spawned from the
> same source. This allows the VM to:
>
> * have a guarantee that all isolates within one IG can safely exchange
> structured objects (currently we rely on embedder for this
> guarantee)
>
> * hot-reload all isolates together (currently we only reload one
> isolate, leaving same-source isolates in inconsistent state)
>
> * make a shared heap for all isolates from the same IG, which paves
> the way for faster communication and sharing of immutable objects.
>
> All isolates within one IG will share the same IsolateGroupSource.
>
> **Embedder changes**
>
> This change makes breaking embedder API changes to support this new
> concept of Isolate Groups: The existing isolate lifecycle callbacks
> given to Dart_Initialize will become Isolate Group lifecycle callbacks.
> A new callback `initialize_isolate` callback will be added which can
> initialize a new isolate within an existing IG.
>
> Existing embedders can be updated by performing the following renames
>
> Dart_CreateIsolate -> Dart_CreateIsolateGroup
> Dart_IsolateCreateCallback -> Dart_IsolateGroupCreateCallback
> Dart_IsolateCleanupCallback -> Dart_IsolateGroupShutdownCallback
> Dart_CreateIsolateFromKernel -> Dart_CreateIsolateGroupFromKernel
> Dart_CurrentIsolateData -> Dart_CurrentIsolateGroupData
> Dart_IsolateData -> Dart_IsolateGroupData
> Dart_GetNativeIsolateData -> Dart_GetNativeIsolateGroupData
> Dart_InitializeParams.create -> Dart_InitializeParams.create_group
> Dart_InitializeParams.cleanup -> Dart_InitializeParams.shutdown_group
> Dart_InitializeParams.shutdown -> Dart_InitializeParams.shutdown_isolate
>
> By default `Isolate.spawn` will cause the creation of a new IG.
>
> Though an embedder can opt-into supporting multiple isolates within one IG by
> providing a callback to the newly added `Dart_InitializeParams.initialize_isolate`.
> The responsibility of this new callback is to initialize an existing
> isolate (which was setup by re-using source code from the spawning
> isolate - i.e. the one which used `Isolate.spawn`) by setting native
> resolvers, initializing global state, etc.
>
> Issue https://github.com/dart-lang/sdk/issues/36648
> Issue https://github.com/dart-lang/sdk/issues/36097
>
> Change-Id: I82437ac017ca33018d45e02f353b0672db155f6a
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105241
> Commit-Queue: Martin Kustermann <kustermann@google.com>
> Reviewed-by: Ryan Macnak <rmacnak@google.com>
> Reviewed-by: Alexander Aprelev <aam@google.com>
TBR=kustermann@google.com,aam@google.com,rmacnak@google.com
Change-Id: Ibd90992a01d61188f27b445c21532e0c46f996ea
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107405
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
133 lines
3.7 KiB
C++
133 lines
3.7 KiB
C++
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_BIN_ISOLATE_DATA_H_
|
|
#define RUNTIME_BIN_ISOLATE_DATA_H_
|
|
|
|
#include <memory>
|
|
#include <utility>
|
|
|
|
#include "include/dart_api.h"
|
|
#include "platform/assert.h"
|
|
#include "platform/globals.h"
|
|
|
|
namespace dart {
|
|
|
|
// Forward declaration.
|
|
template <typename T>
|
|
class MallocGrowableArray;
|
|
|
|
} // namespace dart
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
|
|
// Forward declaration.
|
|
class AppSnapshot;
|
|
class EventHandler;
|
|
class Loader;
|
|
|
|
// Data associated with every isolate in the standalone VM
|
|
// embedding. This is used to free external resources for each isolate
|
|
// when the isolate shuts down.
|
|
class IsolateData {
|
|
public:
|
|
IsolateData(const char* url,
|
|
const char* package_root,
|
|
const char* packages_file,
|
|
AppSnapshot* app_snapshot);
|
|
~IsolateData();
|
|
|
|
char* script_url;
|
|
char* package_root;
|
|
char* packages_file;
|
|
|
|
const std::shared_ptr<uint8_t>& kernel_buffer() const {
|
|
return kernel_buffer_;
|
|
}
|
|
|
|
intptr_t kernel_buffer_size() const { return kernel_buffer_size_; }
|
|
|
|
// Associate the given kernel buffer with this IsolateData without giving it
|
|
// ownership of the buffer.
|
|
void SetKernelBufferUnowned(uint8_t* buffer, intptr_t size) {
|
|
ASSERT(kernel_buffer_.get() == NULL);
|
|
kernel_buffer_ = std::shared_ptr<uint8_t>(buffer, FreeUnownedKernelBuffer);
|
|
kernel_buffer_size_ = size;
|
|
}
|
|
|
|
// Associate the given kernel buffer with this IsolateData and give it
|
|
// ownership of the buffer. This IsolateData is the first one to own the
|
|
// buffer.
|
|
void SetKernelBufferNewlyOwned(uint8_t* buffer, intptr_t size) {
|
|
ASSERT(kernel_buffer_.get() == NULL);
|
|
kernel_buffer_ = std::shared_ptr<uint8_t>(buffer, free);
|
|
kernel_buffer_size_ = size;
|
|
}
|
|
|
|
// Associate the given kernel buffer with this IsolateData and give it
|
|
// ownership of the buffer. The buffer is already owned by another
|
|
// IsolateData.
|
|
void SetKernelBufferAlreadyOwned(std::shared_ptr<uint8_t> buffer,
|
|
intptr_t size) {
|
|
ASSERT(kernel_buffer_.get() == NULL);
|
|
kernel_buffer_ = std::move(buffer);
|
|
kernel_buffer_size_ = size;
|
|
}
|
|
|
|
void UpdatePackagesFile(const char* packages_file_) {
|
|
if (packages_file != NULL) {
|
|
free(packages_file);
|
|
packages_file = NULL;
|
|
}
|
|
packages_file = strdup(packages_file_);
|
|
}
|
|
|
|
const char* resolved_packages_config() const {
|
|
return resolved_packages_config_;
|
|
}
|
|
|
|
void set_resolved_packages_config(const char* packages_config) {
|
|
if (resolved_packages_config_ != NULL) {
|
|
free(resolved_packages_config_);
|
|
resolved_packages_config_ = NULL;
|
|
}
|
|
resolved_packages_config_ = strdup(packages_config);
|
|
}
|
|
|
|
// While loading a loader is associated with the isolate.
|
|
bool HasLoader() const { return loader_ != NULL; }
|
|
Loader* loader() const {
|
|
ASSERT(loader_ != NULL);
|
|
return loader_;
|
|
}
|
|
void set_loader(Loader* loader) {
|
|
ASSERT((loader_ == NULL) || (loader == NULL));
|
|
loader_ = loader;
|
|
}
|
|
MallocGrowableArray<char*>* dependencies() const { return dependencies_; }
|
|
void set_dependencies(MallocGrowableArray<char*>* deps) {
|
|
dependencies_ = deps;
|
|
}
|
|
|
|
void OnIsolateShutdown();
|
|
|
|
private:
|
|
Loader* loader_;
|
|
AppSnapshot* app_snapshot_;
|
|
MallocGrowableArray<char*>* dependencies_;
|
|
char* resolved_packages_config_;
|
|
std::shared_ptr<uint8_t> kernel_buffer_;
|
|
intptr_t kernel_buffer_size_;
|
|
|
|
static void FreeUnownedKernelBuffer(uint8_t*) {}
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(IsolateData);
|
|
};
|
|
|
|
} // namespace bin
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_BIN_ISOLATE_DATA_H_
|