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

Side by Side Diff: src/serialize.h

Issue 686103004: Break allocations in the code serializer into correct chunk sizes. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: addressed comments Created 6 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/heap/spaces.cc ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_SERIALIZE_H_ 5 #ifndef V8_SERIALIZE_H_
6 #define V8_SERIALIZE_H_ 6 #define V8_SERIALIZE_H_
7 7
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/hashmap.h" 9 #include "src/hashmap.h"
10 #include "src/heap-profiler.h" 10 #include "src/heap-profiler.h"
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 enum OnOOM { FATAL_ON_OOM, NULL_ON_OOM }; 397 enum OnOOM { FATAL_ON_OOM, NULL_ON_OOM };
398 398
399 // Deserialize a single object and the objects reachable from it. 399 // Deserialize a single object and the objects reachable from it.
400 // We may want to abort gracefully even if deserialization fails. 400 // We may want to abort gracefully even if deserialization fails.
401 void DeserializePartial(Isolate* isolate, Object** root, 401 void DeserializePartial(Isolate* isolate, Object** root,
402 OnOOM on_oom = FATAL_ON_OOM); 402 OnOOM on_oom = FATAL_ON_OOM);
403 403
404 void AddReservation(int space, uint32_t chunk) { 404 void AddReservation(int space, uint32_t chunk) {
405 DCHECK(space >= 0); 405 DCHECK(space >= 0);
406 DCHECK(space < kNumberOfSpaces); 406 DCHECK(space < kNumberOfSpaces);
407 DCHECK(space == LO_SPACE ||
408 chunk <= static_cast<uint32_t>(Page::kMaxRegularHeapObjectSize));
409 reservations_[space].Add({chunk, NULL, NULL}); 407 reservations_[space].Add({chunk, NULL, NULL});
410 } 408 }
411 409
412 void FlushICacheForNewCodeObjects(); 410 void FlushICacheForNewCodeObjects();
413 411
414 // Serialized user code reference certain objects that are provided in a list 412 // Serialized user code reference certain objects that are provided in a list
415 // By calling this method, we assume that we are deserializing user code. 413 // By calling this method, we assume that we are deserializing user code.
416 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { 414 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) {
417 attached_objects_ = attached_objects; 415 attached_objects_ = attached_objects;
418 } 416 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // There can be only one serializer per V8 process. 489 // There can be only one serializer per V8 process.
492 class Serializer : public SerializerDeserializer { 490 class Serializer : public SerializerDeserializer {
493 public: 491 public:
494 Serializer(Isolate* isolate, SnapshotByteSink* sink); 492 Serializer(Isolate* isolate, SnapshotByteSink* sink);
495 ~Serializer(); 493 ~Serializer();
496 virtual void VisitPointers(Object** start, Object** end) OVERRIDE; 494 virtual void VisitPointers(Object** start, Object** end) OVERRIDE;
497 495
498 void FinalizeAllocation(); 496 void FinalizeAllocation();
499 497
500 Vector<const uint32_t> FinalAllocationChunks(int space) const { 498 Vector<const uint32_t> FinalAllocationChunks(int space) const {
501 DCHECK_EQ(1, completed_chunks_[LO_SPACE].length()); // Already finalized. 499 if (space == LO_SPACE) {
502 DCHECK_EQ(0, pending_chunk_[space]); // No pending chunks. 500 return Vector<const uint32_t>(&large_objects_total_size_, 1);
503 return completed_chunks_[space].ToConstVector(); 501 } else {
502 DCHECK_EQ(0, pending_chunk_[space]); // No pending chunks.
503 return completed_chunks_[space].ToConstVector();
504 }
504 } 505 }
505 506
506 Isolate* isolate() const { return isolate_; } 507 Isolate* isolate() const { return isolate_; }
507 508
508 BackReferenceMap* back_reference_map() { return &back_reference_map_; } 509 BackReferenceMap* back_reference_map() { return &back_reference_map_; }
509 RootIndexMap* root_index_map() { return &root_index_map_; } 510 RootIndexMap* root_index_map() { return &root_index_map_; }
510 511
511 protected: 512 protected:
512 class ObjectSerializer : public ObjectVisitor { 513 class ObjectSerializer : public ObjectVisitor {
513 public: 514 public:
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 WhereToPoint where_to_point, int skip); 574 WhereToPoint where_to_point, int skip);
574 void InitializeAllocators(); 575 void InitializeAllocators();
575 // This will return the space for an object. 576 // This will return the space for an object.
576 static AllocationSpace SpaceOfObject(HeapObject* object); 577 static AllocationSpace SpaceOfObject(HeapObject* object);
577 BackReference AllocateLargeObject(int size); 578 BackReference AllocateLargeObject(int size);
578 BackReference Allocate(AllocationSpace space, int size); 579 BackReference Allocate(AllocationSpace space, int size);
579 int EncodeExternalReference(Address addr) { 580 int EncodeExternalReference(Address addr) {
580 return external_reference_encoder_->Encode(addr); 581 return external_reference_encoder_->Encode(addr);
581 } 582 }
582 583
583 int SpaceAreaSize(int space); 584 // GetInt reads 4 bytes at once, requiring padding at the end.
585 void Pad();
584 586
585 // Some roots should not be serialized, because their actual value depends on 587 // Some roots should not be serialized, because their actual value depends on
586 // absolute addresses and they are reset after deserialization, anyway. 588 // absolute addresses and they are reset after deserialization, anyway.
587 bool ShouldBeSkipped(Object** current); 589 bool ShouldBeSkipped(Object** current);
588 590
591 // We may not need the code address map for logging for every instance
592 // of the serializer. Initialize it on demand.
593 void InitializeCodeAddressMap();
594
595 inline uint32_t max_chunk_size(int space) const {
596 DCHECK_LE(0, space);
597 DCHECK_LT(space, kNumberOfSpaces);
598 return max_chunk_size_[space];
599 }
600
589 Isolate* isolate_; 601 Isolate* isolate_;
590 602
591 // Objects from the same space are put into chunks for bulk-allocation
592 // when deserializing. We have to make sure that each chunk fits into a
593 // page. So we track the chunk size in pending_chunk_ of a space, but
594 // when it exceeds a page, we complete the current chunk and start a new one.
595 uint32_t pending_chunk_[kNumberOfSpaces];
596 List<uint32_t> completed_chunks_[kNumberOfSpaces];
597
598 SnapshotByteSink* sink_; 603 SnapshotByteSink* sink_;
599 ExternalReferenceEncoder* external_reference_encoder_; 604 ExternalReferenceEncoder* external_reference_encoder_;
600 605
601 BackReferenceMap back_reference_map_; 606 BackReferenceMap back_reference_map_;
602 RootIndexMap root_index_map_; 607 RootIndexMap root_index_map_;
603 void Pad();
604 608
605 friend class ObjectSerializer; 609 friend class ObjectSerializer;
606 friend class Deserializer; 610 friend class Deserializer;
607 611
608 // We may not need the code address map for logging for every instance
609 // of the serializer. Initialize it on demand.
610 void InitializeCodeAddressMap();
611
612 private: 612 private:
613 CodeAddressMap* code_address_map_; 613 CodeAddressMap* code_address_map_;
614 // Objects from the same space are put into chunks for bulk-allocation
615 // when deserializing. We have to make sure that each chunk fits into a
616 // page. So we track the chunk size in pending_chunk_ of a space, but
617 // when it exceeds a page, we complete the current chunk and start a new one.
618 uint32_t pending_chunk_[kNumberOfPreallocatedSpaces];
619 List<uint32_t> completed_chunks_[kNumberOfPreallocatedSpaces];
620 uint32_t max_chunk_size_[kNumberOfPreallocatedSpaces];
621
614 // We map serialized large objects to indexes for back-referencing. 622 // We map serialized large objects to indexes for back-referencing.
623 uint32_t large_objects_total_size_;
615 uint32_t seen_large_objects_index_; 624 uint32_t seen_large_objects_index_;
625
616 DISALLOW_COPY_AND_ASSIGN(Serializer); 626 DISALLOW_COPY_AND_ASSIGN(Serializer);
617 }; 627 };
618 628
619 629
620 class PartialSerializer : public Serializer { 630 class PartialSerializer : public Serializer {
621 public: 631 public:
622 PartialSerializer(Isolate* isolate, 632 PartialSerializer(Isolate* isolate,
623 Serializer* startup_snapshot_serializer, 633 Serializer* startup_snapshot_serializer,
624 SnapshotByteSink* sink) 634 SnapshotByteSink* sink)
625 : Serializer(isolate, sink), 635 : Serializer(isolate, sink),
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 // Following the header, we store, in sequential order 854 // Following the header, we store, in sequential order
845 // - code stub keys 855 // - code stub keys
846 // - serialization payload 856 // - serialization payload
847 857
848 ScriptData* script_data_; 858 ScriptData* script_data_;
849 bool owns_script_data_; 859 bool owns_script_data_;
850 }; 860 };
851 } } // namespace v8::internal 861 } } // namespace v8::internal
852 862
853 #endif // V8_SERIALIZE_H_ 863 #endif // V8_SERIALIZE_H_
OLDNEW
« no previous file with comments | « src/heap/spaces.cc ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698