Index: runtime/vm/isolate.h |
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h |
index c2fc95554d71e231affe824e2d343fce1bd32818..b418fd6fec65f34c19cb88c74d6a6411a11fd56c 100644 |
--- a/runtime/vm/isolate.h |
+++ b/runtime/vm/isolate.h |
@@ -35,6 +35,7 @@ class HandleVisitor; |
class Heap; |
class ICData; |
class IsolateProfilerData; |
+class IsolateReloadContext; |
class IsolateSpawnState; |
class Log; |
class MessageHandler; |
@@ -47,12 +48,12 @@ class RawInstance; |
class RawArray; |
class RawContext; |
class RawDouble; |
+class RawError; |
+class RawField; |
class RawGrowableObjectArray; |
class RawMint; |
class RawObject; |
class RawInteger; |
-class RawError; |
-class RawField; |
class RawFloat32x4; |
class RawInt32x4; |
class RawUserTag; |
@@ -91,6 +92,18 @@ class NoOOBMessageScope : public StackResource { |
}; |
+// Disallow isolate reload. |
+class NoReloadScope : public StackResource { |
+ public: |
+ NoReloadScope(Isolate* isolate, Thread* thread); |
+ ~NoReloadScope(); |
+ |
+ private: |
+ Isolate* isolate_; |
+ DISALLOW_COPY_AND_ASSIGN(NoReloadScope); |
+}; |
+ |
+ |
class Isolate : public BaseIsolate { |
public: |
// Keep both these enums in sync with isolate_patch.dart. |
@@ -150,6 +163,9 @@ class Isolate : public BaseIsolate { |
return OFFSET_OF(Isolate, class_table_); |
} |
+ // Prefers old classes when we are in the middle of a reload. |
+ RawClass* GetClassForHeapWalkAt(intptr_t cid); |
+ |
static intptr_t ic_miss_code_offset() { |
return OFFSET_OF(Isolate, ic_miss_code_); |
} |
@@ -237,6 +253,10 @@ class Isolate : public BaseIsolate { |
// Marks all libraries as loaded. |
void DoneLoading(); |
+ void DoneFinalizing(); |
+ |
+ void OnStackReload(); |
+ void ReloadSources(bool test_mode = false); |
bool MakeRunnable(); |
void Run(); |
@@ -388,6 +408,22 @@ class Isolate : public BaseIsolate { |
background_compiler_ = value; |
} |
+ void enable_background_compiler() { |
+ background_compiler_disabled_depth_--; |
+ if (background_compiler_disabled_depth_ < 0) { |
+ FATAL("Mismatched number of calls to disable_background_compiler and " |
+ "enable_background_compiler."); |
+ } |
+ } |
+ |
+ void disable_background_compiler() { |
+ background_compiler_disabled_depth_++; |
+ } |
+ |
+ bool is_background_compiler_disabled() const { |
+ return background_compiler_disabled_depth_ > 0; |
+ } |
+ |
void UpdateLastAllocationProfileAccumulatorResetTimestamp() { |
last_allocationprofile_accumulator_reset_timestamp_ = |
OS::GetCurrentTimeMillis(); |
@@ -432,6 +468,22 @@ class Isolate : public BaseIsolate { |
return &vm_tag_counters_; |
} |
+ bool IsReloading() const { |
+ return reload_context_ != NULL; |
+ } |
+ |
+ IsolateReloadContext* reload_context() { |
+ return reload_context_; |
+ } |
+ |
+ bool HasAttemptedReload() const { |
+ return has_attempted_reload_; |
+ } |
+ |
+ bool CanReload() const; |
+ |
+ void ReportReloadError(const Error& error); |
+ |
uword user_tag() const { |
return user_tag_; |
} |
@@ -717,6 +769,7 @@ class Isolate : public BaseIsolate { |
// Background compilation. |
BackgroundCompiler* background_compiler_; |
+ intptr_t background_compiler_disabled_depth_; |
// We use 6 list entries for each pending service extension calls. |
enum { |
@@ -769,6 +822,11 @@ class Isolate : public BaseIsolate { |
Monitor* spawn_count_monitor_; |
intptr_t spawn_count_; |
+ // Has a reload ever been attempted? |
+ bool has_attempted_reload_; |
+ intptr_t no_reload_scope_depth_; // we can only reload when this is 0. |
+ IsolateReloadContext* reload_context_; |
+ |
#define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \ |
type metric_##variable##_; |
ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); |
@@ -795,12 +853,15 @@ class Isolate : public BaseIsolate { |
REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) |
#undef REUSABLE_FRIEND_DECLARATION |
+ friend class Become; // VisitObjectPointers |
friend class GCMarker; // VisitObjectPointers |
friend class SafepointHandler; |
friend class Scavenger; // VisitObjectPointers |
friend class ServiceIsolate; |
friend class Thread; |
friend class Timeline; |
+ friend class NoReloadScope; // reload_block |
+ |
DISALLOW_COPY_AND_ASSIGN(Isolate); |
}; |