Skip to content

Commit 8c79102

Browse files
aamcommit-bot@chromium.org
authored and
commit-bot@chromium.org
committed
[vm/isolates] Move saved_initial_field_table to isolate group.
This improves performance of spawn isolate since it drops a need to lock isolate group when spawning new isolate. Change-Id: I867c13c808a3eb356f3d53323bb8aef06541019e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/147046 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Alexander Aprelev <aam@google.com>
1 parent 9eff985 commit 8c79102

File tree

5 files changed

+18
-36
lines changed

5 files changed

+18
-36
lines changed

runtime/vm/clustered_snapshot.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,10 +1203,6 @@ class FieldDeserializationCluster : public DeserializationCluster {
12031203
field.InitializeGuardedListLengthInObjectOffset();
12041204
}
12051205
}
1206-
1207-
Isolate* isolate = Isolate::Current();
1208-
isolate->set_saved_initial_field_table(
1209-
std::shared_ptr<FieldTable>(isolate->field_table()->Clone()));
12101206
}
12111207
};
12121208

runtime/vm/dart.cc

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -671,25 +671,10 @@ static bool CloneIntoChildIsolateAOT(Thread* T,
671671
if (source_isolate_group == nullptr) {
672672
return false;
673673
}
674-
bool has_found_donor_isolate = false;
675-
std::shared_ptr<FieldTable> donor_saved_initial_field_table;
676-
source_isolate_group->RunWithLockedGroup([&]() {
677-
Isolate* donor_isolate = source_isolate_group->FirstIsolateLocked();
678-
if (donor_isolate == nullptr) {
679-
return;
680-
}
681-
has_found_donor_isolate = true;
682-
// Initialize field_table with initial values.
683-
donor_saved_initial_field_table =
684-
donor_isolate->saved_initial_field_table_shareable();
685-
});
686-
if (!has_found_donor_isolate) {
687-
return false;
688-
}
689674
I->isolate_object_store()->Init();
690675
I->isolate_object_store()->PreallocateObjects();
691-
I->set_field_table(T, donor_saved_initial_field_table->Clone());
692-
I->set_saved_initial_field_table(donor_saved_initial_field_table);
676+
I->set_field_table(
677+
T, source_isolate_group->saved_initial_field_table()->Clone());
693678

694679
return true;
695680
}
@@ -735,6 +720,8 @@ ErrorPtr Dart::InitIsolateFromSnapshot(Thread* T,
735720
}
736721

737722
ReversePcLookupCache::BuildAndAttachToIsolateGroup(I->group());
723+
I->group()->set_saved_initial_field_table(
724+
std::shared_ptr<FieldTable>(I->field_table()->Clone()));
738725

739726
#if defined(SUPPORT_TIMELINE)
740727
if (tbes.enabled()) {

runtime/vm/isolate.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2583,9 +2583,6 @@ void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
25832583

25842584
// Visit objects in the field table.
25852585
field_table()->VisitObjectPointers(visitor);
2586-
if (saved_initial_field_table() != nullptr) {
2587-
saved_initial_field_table()->VisitObjectPointers(visitor);
2588-
}
25892586

25902587
visitor->clear_gc_root_type();
25912588
// Visit the objects directly referenced from the isolate structure.
@@ -2756,6 +2753,9 @@ void IsolateGroup::VisitObjectPointers(ObjectPointerVisitor* visitor,
27562753
object_store()->VisitObjectPointers(visitor);
27572754
}
27582755
visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_unlinked_calls_));
2756+
if (saved_initial_field_table() != nullptr) {
2757+
saved_initial_field_table()->VisitObjectPointers(visitor);
2758+
}
27592759
VisitStackPointers(visitor, validate_frames);
27602760
}
27612761

runtime/vm/isolate.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,16 @@ class IsolateGroup : public IntrusiveDListEntry<IsolateGroup> {
532532
reverse_pc_lookup_cache_ = table;
533533
}
534534

535+
FieldTable* saved_initial_field_table() const {
536+
return saved_initial_field_table_.get();
537+
}
538+
std::shared_ptr<FieldTable> saved_initial_field_table_shareable() {
539+
return saved_initial_field_table_;
540+
}
541+
void set_saved_initial_field_table(std::shared_ptr<FieldTable> field_table) {
542+
saved_initial_field_table_ = field_table;
543+
}
544+
535545
MutatorThreadPool* thread_pool() { return thread_pool_.get(); }
536546

537547
private:
@@ -618,6 +628,7 @@ class IsolateGroup : public IntrusiveDListEntry<IsolateGroup> {
618628
std::unique_ptr<DispatchTable> dispatch_table_;
619629
ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
620630
ArrayPtr saved_unlinked_calls_;
631+
std::shared_ptr<FieldTable> saved_initial_field_table_;
621632

622633
uint32_t isolate_group_flags_ = 0;
623634
};
@@ -726,16 +737,6 @@ class Isolate : public BaseIsolate, public IntrusiveDListEntry<Isolate> {
726737
T->field_table_values_ = field_table->table();
727738
}
728739

729-
FieldTable* saved_initial_field_table() const {
730-
return saved_initial_field_table_.get();
731-
}
732-
std::shared_ptr<FieldTable> saved_initial_field_table_shareable() {
733-
return saved_initial_field_table_;
734-
}
735-
void set_saved_initial_field_table(std::shared_ptr<FieldTable> field_table) {
736-
saved_initial_field_table_ = field_table;
737-
}
738-
739740
IsolateObjectStore* isolate_object_store() const {
740741
return isolate_object_store_.get();
741742
}
@@ -1372,7 +1373,6 @@ class Isolate : public BaseIsolate, public IntrusiveDListEntry<Isolate> {
13721373

13731374
IsolateGroup* isolate_group_;
13741375
IdleTimeHandler idle_time_handler_;
1375-
std::shared_ptr<FieldTable> saved_initial_field_table_;
13761376
std::unique_ptr<IsolateObjectStore> isolate_object_store_;
13771377
// shared in AOT(same pointer as on IsolateGroup), not shared in JIT
13781378
std::shared_ptr<ObjectStore> object_store_shared_ptr_;

runtime/vm/object_store.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ class ObjectPointerVisitor;
211211
RW(Array, dispatch_table_code_entries) \
212212
RW(Array, code_order_table) \
213213
RW(Array, obfuscation_map) \
214-
RW(Array, saved_initial_field_values) \
215214
RW(Class, ffi_pointer_class) \
216215
RW(Class, ffi_native_type_class) \
217216
RW(Class, ffi_struct_class) \

0 commit comments

Comments
 (0)