 Chromium Code Reviews
 Chromium Code Reviews Issue 2868103002:
  [deserializer] Make large object deserialization GC safe  (Closed)
    
  
    Issue 2868103002:
  [deserializer] Make large object deserialization GC safe  (Closed) 
  | OLD | NEW | 
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 | 
| OLD | NEW |