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

Side by Side Diff: src/snapshot/deserializer.cc

Issue 2868103002: [deserializer] Make large object deserialization GC safe (Closed)
Patch Set: Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/snapshot/deserializer.h" 5 #include "src/snapshot/deserializer.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/assembler-inl.h" 8 #include "src/assembler-inl.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/deoptimizer.h" 10 #include "src/deoptimizer.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 for (Code* code : new_code_objects_) { 47 for (Code* code : new_code_objects_) {
48 // Record all references to embedded objects in the new code object. 48 // Record all references to embedded objects in the new code object.
49 isolate_->heap()->RecordWritesIntoCode(code); 49 isolate_->heap()->RecordWritesIntoCode(code);
50 50
51 if (FLAG_serialize_age_code) code->PreAge(isolate_); 51 if (FLAG_serialize_age_code) code->PreAge(isolate_);
52 Assembler::FlushICache(isolate_, code->instruction_start(), 52 Assembler::FlushICache(isolate_, code->instruction_start(),
53 code->instruction_size()); 53 code->instruction_size());
54 } 54 }
55 } 55 }
56 56
57 void Deserializer::RecordWritesForLargeObjects() {
58 Heap* heap = isolate_->heap();
59 if (!heap->incremental_marking()->black_allocation()) return;
60 for (HeapObject* object : deserialized_large_objects_) {
61 heap->incremental_marking()->IterateBlackObject(object);
62 }
63 }
64
57 bool Deserializer::ReserveSpace() { 65 bool Deserializer::ReserveSpace() {
58 #ifdef DEBUG 66 #ifdef DEBUG
59 for (int i = NEW_SPACE; i < kNumberOfSpaces; ++i) { 67 for (int i = NEW_SPACE; i < kNumberOfSpaces; ++i) {
60 CHECK(reservations_[i].size() > 0); 68 CHECK(reservations_[i].size() > 0);
61 } 69 }
62 #endif // DEBUG 70 #endif // DEBUG
63 DCHECK(allocated_maps_.is_empty()); 71 DCHECK(allocated_maps_.is_empty());
64 if (!isolate_->heap()->ReserveSpace(reservations_, &allocated_maps_)) 72 if (!isolate_->heap()->ReserveSpace(reservations_, &allocated_maps_))
65 return false; 73 return false;
66 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) { 74 for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 } else { 172 } else {
165 deserializing_user_code_ = true; 173 deserializing_user_code_ = true;
166 HandleScope scope(isolate); 174 HandleScope scope(isolate);
167 Handle<HeapObject> result; 175 Handle<HeapObject> result;
168 { 176 {
169 DisallowHeapAllocation no_gc; 177 DisallowHeapAllocation no_gc;
170 Object* root; 178 Object* root;
171 VisitRootPointer(Root::kPartialSnapshotCache, &root); 179 VisitRootPointer(Root::kPartialSnapshotCache, &root);
172 DeserializeDeferredObjects(); 180 DeserializeDeferredObjects();
173 FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects(); 181 FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects();
182 RecordWritesForLargeObjects();
Hannes Payer (out of office) 2017/05/09 21:19:51 Ideally, we would move this one into RegisterReser
Jakob Kummerow 2017/05/10 11:09:07 Done.
174 result = Handle<HeapObject>(HeapObject::cast(root)); 183 result = Handle<HeapObject>(HeapObject::cast(root));
175 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_); 184 isolate->heap()->RegisterReservationsForBlackAllocation(reservations_);
Hannes Payer (out of office) 2017/05/09 21:19:51 I guess that means we never have reservations for
Jakob Kummerow 2017/05/10 11:09:07 Correct; LO space doesn't use reservations (becaus
176 } 185 }
177 CommitPostProcessedObjects(isolate); 186 CommitPostProcessedObjects(isolate);
178 return scope.CloseAndEscape(result); 187 return scope.CloseAndEscape(result);
179 } 188 }
180 } 189 }
181 190
182 Deserializer::~Deserializer() { 191 Deserializer::~Deserializer() {
183 #ifdef DEBUG 192 #ifdef DEBUG
184 // Do not perform checks if we aborted deserialization. 193 // Do not perform checks if we aborted deserialization.
185 if (source_.position() == 0) return; 194 if (source_.position() == 0) return;
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 919
911 default: 920 default:
912 CHECK(false); 921 CHECK(false);
913 } 922 }
914 } 923 }
915 CHECK_EQ(limit, current); 924 CHECK_EQ(limit, current);
916 return true; 925 return true;
917 } 926 }
918 } // namespace internal 927 } // namespace internal
919 } // namespace v8 928 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698