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

Unified Diff: runtime/vm/isolate.cc

Issue 1877973002: Invalidate background compilation only if relevant fields were invalidated. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: sync Created 4 years, 8 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
Index: runtime/vm/isolate.cc
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index d719748d1e276a2ecb7d52e03ba9cb9867a0a580..de02503018ce67f397d45639c8f16871a46e3eb0 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -795,8 +795,9 @@ Isolate::Isolate(const Dart_IsolateFlags& api_flags)
field_invalidation_gen_(kInvalidGen),
loading_invalidation_gen_(kInvalidGen),
top_level_parsing_count_(0),
- boxed_field_list_mutex_(new Mutex()),
+ field_list_mutex_(new Mutex()),
boxed_field_list_(GrowableObjectArray::null()),
+ disabling_field_list_(GrowableObjectArray::null()),
spawn_count_monitor_(new Monitor()),
spawn_count_(0) {
NOT_IN_PRODUCT(FlagsCopyFrom(api_flags));
@@ -840,8 +841,8 @@ Isolate::~Isolate() {
object_id_ring_ = NULL;
delete pause_loop_monitor_;
pause_loop_monitor_ = NULL;
- delete boxed_field_list_mutex_;
- boxed_field_list_mutex_ = NULL;
+ delete field_list_mutex_;
+ field_list_mutex_ = NULL;
ASSERT(spawn_count_ == 0);
delete spawn_count_monitor_;
delete safepoint_handler_;
@@ -1653,12 +1654,18 @@ void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
visitor->VisitPointer(
reinterpret_cast<RawObject**>(&registered_service_extension_handlers_));
- // Visit the boxed_field_list.
+ // 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_mutex_ lock has been taken.
+ // when at safepoint or the field_list_mutex_ lock has been taken.
visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
+ // Visit the disabling_field_list.
+ // 'disabling_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 field_list_mutex_ lock has been taken.
+ visitor->VisitPointer(reinterpret_cast<RawObject**>(&disabling_field_list_));
+
// Visit objects in the debugger.
if (FLAG_support_debugger) {
debugger()->VisitObjectPointers(visitor);
@@ -1883,11 +1890,54 @@ void Isolate::set_registered_service_extension_handlers(
}
+// Used by mutator thread to notify background compiler which fields
+// triggered code invalidation.
+void Isolate::AddDisablingField(const Field& field) {
+ ASSERT(Thread::Current()->IsMutatorThread());
+ SafepointMutexLocker ml(field_list_mutex_);
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ disabling_field_list_ = GrowableObjectArray::New(Heap::kOld);
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ array.Add(field, Heap::kOld);
+}
+
+
+RawField* Isolate::GetDisablingField() {
+ ASSERT(Compiler::IsBackgroundCompilation());
+ MutexLocker ml(field_list_mutex_);
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ return Field::null();
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ if (array.Length() == 0) {
+ return Field::null();
+ }
+ return Field::RawCast(array.RemoveLast());
+}
+
+
+void Isolate::ClearDisablingFieldList() {
+ MutexLocker ml(field_list_mutex_);
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ return;
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ if (array.Length() > 0) {
+ array.SetLength(0);
+ }
+}
+
+
void Isolate::AddDeoptimizingBoxedField(const Field& field) {
+ ASSERT(Compiler::IsBackgroundCompilation());
ASSERT(field.IsOriginal());
// The enclosed code allocates objects and can potentially trigger a GC,
// ensure that we account for safepoints when grabbing the lock.
- SafepointMutexLocker ml(boxed_field_list_mutex_);
+ SafepointMutexLocker ml(field_list_mutex_);
if (boxed_field_list_ == GrowableObjectArray::null()) {
boxed_field_list_ = GrowableObjectArray::New(Heap::kOld);
}
@@ -1898,7 +1948,8 @@ void Isolate::AddDeoptimizingBoxedField(const Field& field) {
RawField* Isolate::GetDeoptimizingBoxedField() {
- MutexLocker ml(boxed_field_list_mutex_);
+ ASSERT(Thread::Current()->IsMutatorThread());
+ MutexLocker ml(field_list_mutex_);
if (boxed_field_list_ == GrowableObjectArray::null()) {
return Field::null();
}
« runtime/vm/compiler.cc ('K') | « runtime/vm/isolate.h ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698