Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1104)

Unified Diff: runtime/vm/isolate.h

Issue 1560853002: Fix Shutdown race. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate.h
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 95068b7c7b755c22b423bdc2d0f44fab5dea33a9..ed8178306b4f9990ae68635465f2455a2998401f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -423,6 +423,12 @@ class Isolate : public BaseIsolate {
gc_epilogue_callback_ = callback;
}
+ Monitor* spawn_count_monitor() const { return spawn_count_monitor_; }
+ intptr_t* spawn_count() { return &spawn_count_; }
+
+ void IncrementSpawnCount();
+ void WaitForOutstandingSpawns();
+
static void SetCreateCallback(Dart_IsolateCreateCallback cb) {
create_callback_ = cb;
}
@@ -823,6 +829,11 @@ class Isolate : public BaseIsolate {
uint32_t field_invalidation_gen_;
uint32_t prefix_invalidation_gen_;
+ // This guards spawn_count_. An isolate cannot complete shutdown and be
+ // destroyed while there are child isolates in the midst of a spawn.
+ Monitor* spawn_count_monitor_;
+ intptr_t spawn_count_;
+
#define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \
type metric_##variable##_;
ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE);
@@ -917,6 +928,8 @@ class IsolateSpawnState {
void* init_data,
const Function& func,
const Instance& message,
+ Monitor* spawn_count_monitor,
+ intptr_t* spawn_count,
bool paused,
bool errorsAreFatal,
Dart_Port onExit,
@@ -928,6 +941,8 @@ class IsolateSpawnState {
const char** package_map,
const Instance& args,
const Instance& message,
+ Monitor* spawn_count_monitor,
+ intptr_t* spawn_count,
bool paused,
bool errorsAreFatal,
Dart_Port onExit,
@@ -957,6 +972,8 @@ class IsolateSpawnState {
RawInstance* BuildArgs(Thread* thread);
RawInstance* BuildMessage(Thread* thread);
+ void DecrementSpawnCount();
+
private:
Isolate* isolate_;
Dart_Port parent_port_;
@@ -974,6 +991,12 @@ class IsolateSpawnState {
intptr_t serialized_args_len_;
uint8_t* serialized_message_;
intptr_t serialized_message_len_;
+
+ // This counter tracks the number of outstanding calls to spawn by the parent
+ // isolate.
+ Monitor* spawn_count_monitor_;
+ intptr_t* spawn_count_;
+
Isolate::Flags isolate_flags_;
bool paused_;
bool errors_are_fatal_;
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698