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

Unified Diff: runtime/vm/isolate.cc

Issue 1685963002: Pass field to mutator thread so that it can be marked as boxed and all dependent code deoptimized (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address reviewer's comments Created 4 years, 10 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/isolate.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate.cc
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3214d5f048da92426e00d18bc2d9105b86759acf..9974225170d53be8f2e191c2bc38b73505189ee7 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -764,6 +764,8 @@ void BaseIsolate::AssertCurrentThreadIsMutator() const {
#define REUSABLE_HANDLE_INITIALIZERS(object) \
object##_handle_(NULL),
+// TODO(srdjan): Some Isolate monitors can be shared. Replace their usage with
+// that shared monitor.
Isolate::Isolate(const Dart_IsolateFlags& api_flags)
: stack_limit_(0),
store_buffer_(new StoreBuffer()),
@@ -831,6 +833,8 @@ Isolate::Isolate(const Dart_IsolateFlags& api_flags)
cha_invalidation_gen_(kInvalidGen),
field_invalidation_gen_(kInvalidGen),
prefix_invalidation_gen_(kInvalidGen),
+ boxed_field_list_monitor_(new Monitor()),
+ boxed_field_list_(GrowableObjectArray::null()),
spawn_count_monitor_(new Monitor()),
spawn_count_(0) {
flags_.CopyFrom(api_flags);
@@ -868,6 +872,8 @@ Isolate::~Isolate() {
object_id_ring_ = NULL;
delete pause_loop_monitor_;
pause_loop_monitor_ = NULL;
+ delete boxed_field_list_monitor_;
+ boxed_field_list_monitor_ = NULL;
ASSERT(spawn_count_ == 0);
delete spawn_count_monitor_;
if (compiler_stats_ != NULL) {
@@ -1846,6 +1852,12 @@ void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
visitor->VisitPointer(
reinterpret_cast<RawObject**>(&registered_service_extension_handlers_));
+ // Visit the boxed_field_list.
+ // 'boxed_field_list_' access via mutator and background compilation threads
+ // is guarded with a monitor. This means that we can visit it only
+ // when at safepoint or the boxed_field_list_monitor_ lock has been taken.
+ visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
+
// Visit objects in the debugger.
if (FLAG_support_debugger) {
debugger()->VisitObjectPointers(visitor);
@@ -2050,6 +2062,31 @@ void Isolate::set_registered_service_extension_handlers(
}
+void Isolate::AddDeoptimizingBoxedField(const Field& field) {
+ MonitorLocker ml(boxed_field_list_monitor_);
+ if (boxed_field_list_ == GrowableObjectArray::null()) {
+ boxed_field_list_ = GrowableObjectArray::New(Heap::kOld);
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(boxed_field_list_);
+ array.Add(field, Heap::kOld);
+}
+
+
+RawField* Isolate::GetDeoptimizingBoxedField() {
+ MonitorLocker ml(boxed_field_list_monitor_);
+ if (boxed_field_list_ == GrowableObjectArray::null()) {
+ return Field::null();
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(boxed_field_list_);
+ if (array.Length() == 0) {
+ return Field::null();
+ }
+ return Field::RawCast(array.RemoveLast());
+}
+
+
RawObject* Isolate::InvokePendingServiceExtensionCalls() {
if (!FLAG_support_service) {
return Object::null();
« no previous file with comments | « runtime/vm/isolate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698