| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ | 5 #ifndef RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ |
| 6 #define RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ | 6 #define RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ |
| 7 | 7 |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
| 10 #include "vm/bitfield.h" | 10 #include "vm/bitfield.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 // Write the cluster type and information needed to allocate the cluster's | 58 // Write the cluster type and information needed to allocate the cluster's |
| 59 // objects. For fixed sized objects, this is just the object count. For | 59 // objects. For fixed sized objects, this is just the object count. For |
| 60 // variable sized objects, this is the object count and length of each object. | 60 // variable sized objects, this is the object count and length of each object. |
| 61 virtual void WriteAlloc(Serializer* serializer) = 0; | 61 virtual void WriteAlloc(Serializer* serializer) = 0; |
| 62 | 62 |
| 63 // Write the byte and reference data of the cluster's objects. | 63 // Write the byte and reference data of the cluster's objects. |
| 64 virtual void WriteFill(Serializer* serializer) = 0; | 64 virtual void WriteFill(Serializer* serializer) = 0; |
| 65 }; | 65 }; |
| 66 | 66 |
| 67 | |
| 68 class DeserializationCluster : public ZoneAllocated { | 67 class DeserializationCluster : public ZoneAllocated { |
| 69 public: | 68 public: |
| 70 DeserializationCluster() : start_index_(-1), stop_index_(-1) {} | 69 DeserializationCluster() : start_index_(-1), stop_index_(-1) {} |
| 71 virtual ~DeserializationCluster() {} | 70 virtual ~DeserializationCluster() {} |
| 72 | 71 |
| 73 // Allocate memory for all objects in the cluster and write their addresses | 72 // Allocate memory for all objects in the cluster and write their addresses |
| 74 // into the ref array. Do not touch this memory. | 73 // into the ref array. Do not touch this memory. |
| 75 virtual void ReadAlloc(Deserializer* deserializer) = 0; | 74 virtual void ReadAlloc(Deserializer* deserializer) = 0; |
| 76 | 75 |
| 77 // Initialize the cluster's objects. Do not touch the memory of other objects. | 76 // Initialize the cluster's objects. Do not touch the memory of other objects. |
| 78 virtual void ReadFill(Deserializer* deserializer) = 0; | 77 virtual void ReadFill(Deserializer* deserializer) = 0; |
| 79 | 78 |
| 80 // Complete any action that requires the full graph to be deserialized, such | 79 // Complete any action that requires the full graph to be deserialized, such |
| 81 // as rehashing. | 80 // as rehashing. |
| 82 virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {} | 81 virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {} |
| 83 | 82 |
| 84 protected: | 83 protected: |
| 85 // The range of the ref array that belongs to this cluster. | 84 // The range of the ref array that belongs to this cluster. |
| 86 intptr_t start_index_; | 85 intptr_t start_index_; |
| 87 intptr_t stop_index_; | 86 intptr_t stop_index_; |
| 88 }; | 87 }; |
| 89 | 88 |
| 90 | |
| 91 class SmiObjectIdPair { | 89 class SmiObjectIdPair { |
| 92 public: | 90 public: |
| 93 SmiObjectIdPair() : smi_(NULL), id_(0) {} | 91 SmiObjectIdPair() : smi_(NULL), id_(0) {} |
| 94 RawSmi* smi_; | 92 RawSmi* smi_; |
| 95 intptr_t id_; | 93 intptr_t id_; |
| 96 | 94 |
| 97 bool operator==(const SmiObjectIdPair& other) const { | 95 bool operator==(const SmiObjectIdPair& other) const { |
| 98 return (smi_ == other.smi_) && (id_ == other.id_); | 96 return (smi_ == other.smi_) && (id_ == other.id_); |
| 99 } | 97 } |
| 100 }; | 98 }; |
| 101 | 99 |
| 102 | |
| 103 class SmiObjectIdPairTrait { | 100 class SmiObjectIdPairTrait { |
| 104 public: | 101 public: |
| 105 typedef RawSmi* Key; | 102 typedef RawSmi* Key; |
| 106 typedef intptr_t Value; | 103 typedef intptr_t Value; |
| 107 typedef SmiObjectIdPair Pair; | 104 typedef SmiObjectIdPair Pair; |
| 108 | 105 |
| 109 static Key KeyOf(Pair kv) { return kv.smi_; } | 106 static Key KeyOf(Pair kv) { return kv.smi_; } |
| 110 static Value ValueOf(Pair kv) { return kv.id_; } | 107 static Value ValueOf(Pair kv) { return kv.id_; } |
| 111 static inline intptr_t Hashcode(Key key) { return Smi::Value(key); } | 108 static inline intptr_t Hashcode(Key key) { return Smi::Value(key); } |
| 112 static inline bool IsKeyEqual(Pair kv, Key key) { return kv.smi_ == key; } | 109 static inline bool IsKeyEqual(Pair kv, Key key) { return kv.smi_ == key; } |
| 113 }; | 110 }; |
| 114 | 111 |
| 115 | |
| 116 typedef DirectChainedHashMap<SmiObjectIdPairTrait> SmiObjectIdMap; | 112 typedef DirectChainedHashMap<SmiObjectIdPairTrait> SmiObjectIdMap; |
| 117 | 113 |
| 118 | |
| 119 class Serializer : public StackResource { | 114 class Serializer : public StackResource { |
| 120 public: | 115 public: |
| 121 Serializer(Thread* thread, | 116 Serializer(Thread* thread, |
| 122 Snapshot::Kind kind, | 117 Snapshot::Kind kind, |
| 123 uint8_t** buffer, | 118 uint8_t** buffer, |
| 124 ReAlloc alloc, | 119 ReAlloc alloc, |
| 125 intptr_t initial_size, | 120 intptr_t initial_size, |
| 126 ImageWriter* image_writer_); | 121 ImageWriter* image_writer_); |
| 127 ~Serializer(); | 122 ~Serializer(); |
| 128 | 123 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 SmiObjectIdMap smi_ids_; | 268 SmiObjectIdMap smi_ids_; |
| 274 | 269 |
| 275 #if defined(SNAPSHOT_BACKTRACE) | 270 #if defined(SNAPSHOT_BACKTRACE) |
| 276 RawObject* current_parent_; | 271 RawObject* current_parent_; |
| 277 GrowableArray<Object*> parent_pairs_; | 272 GrowableArray<Object*> parent_pairs_; |
| 278 #endif | 273 #endif |
| 279 | 274 |
| 280 DISALLOW_IMPLICIT_CONSTRUCTORS(Serializer); | 275 DISALLOW_IMPLICIT_CONSTRUCTORS(Serializer); |
| 281 }; | 276 }; |
| 282 | 277 |
| 283 | |
| 284 class Deserializer : public StackResource { | 278 class Deserializer : public StackResource { |
| 285 public: | 279 public: |
| 286 Deserializer(Thread* thread, | 280 Deserializer(Thread* thread, |
| 287 Snapshot::Kind kind, | 281 Snapshot::Kind kind, |
| 288 const uint8_t* buffer, | 282 const uint8_t* buffer, |
| 289 intptr_t size, | 283 intptr_t size, |
| 290 const uint8_t* instructions_buffer, | 284 const uint8_t* instructions_buffer, |
| 291 const uint8_t* data_buffer); | 285 const uint8_t* data_buffer); |
| 292 ~Deserializer(); | 286 ~Deserializer(); |
| 293 | 287 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 ReadStream stream_; | 367 ReadStream stream_; |
| 374 ImageReader* image_reader_; | 368 ImageReader* image_reader_; |
| 375 intptr_t num_base_objects_; | 369 intptr_t num_base_objects_; |
| 376 intptr_t num_objects_; | 370 intptr_t num_objects_; |
| 377 intptr_t num_clusters_; | 371 intptr_t num_clusters_; |
| 378 RawArray* refs_; | 372 RawArray* refs_; |
| 379 intptr_t next_ref_index_; | 373 intptr_t next_ref_index_; |
| 380 DeserializationCluster** clusters_; | 374 DeserializationCluster** clusters_; |
| 381 }; | 375 }; |
| 382 | 376 |
| 383 | |
| 384 class FullSnapshotWriter { | 377 class FullSnapshotWriter { |
| 385 public: | 378 public: |
| 386 static const intptr_t kInitialSize = 64 * KB; | 379 static const intptr_t kInitialSize = 64 * KB; |
| 387 FullSnapshotWriter(Snapshot::Kind kind, | 380 FullSnapshotWriter(Snapshot::Kind kind, |
| 388 uint8_t** vm_snapshot_data_buffer, | 381 uint8_t** vm_snapshot_data_buffer, |
| 389 uint8_t** isolate_snapshot_data_buffer, | 382 uint8_t** isolate_snapshot_data_buffer, |
| 390 ReAlloc alloc, | 383 ReAlloc alloc, |
| 391 ImageWriter* vm_image_writer, | 384 ImageWriter* vm_image_writer, |
| 392 ImageWriter* iso_image_writer); | 385 ImageWriter* iso_image_writer); |
| 393 ~FullSnapshotWriter(); | 386 ~FullSnapshotWriter(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 | 425 |
| 433 // Stats for benchmarking. | 426 // Stats for benchmarking. |
| 434 intptr_t clustered_vm_size_; | 427 intptr_t clustered_vm_size_; |
| 435 intptr_t clustered_isolate_size_; | 428 intptr_t clustered_isolate_size_; |
| 436 intptr_t mapped_data_size_; | 429 intptr_t mapped_data_size_; |
| 437 intptr_t mapped_instructions_size_; | 430 intptr_t mapped_instructions_size_; |
| 438 | 431 |
| 439 DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); | 432 DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter); |
| 440 }; | 433 }; |
| 441 | 434 |
| 442 | |
| 443 class FullSnapshotReader { | 435 class FullSnapshotReader { |
| 444 public: | 436 public: |
| 445 FullSnapshotReader(const Snapshot* snapshot, | 437 FullSnapshotReader(const Snapshot* snapshot, |
| 446 const uint8_t* instructions_buffer, | 438 const uint8_t* instructions_buffer, |
| 447 Thread* thread); | 439 Thread* thread); |
| 448 ~FullSnapshotReader() {} | 440 ~FullSnapshotReader() {} |
| 449 | 441 |
| 450 RawApiError* ReadVMSnapshot(); | 442 RawApiError* ReadVMSnapshot(); |
| 451 RawApiError* ReadIsolateSnapshot(); | 443 RawApiError* ReadIsolateSnapshot(); |
| 452 | 444 |
| 453 private: | 445 private: |
| 454 Snapshot::Kind kind_; | 446 Snapshot::Kind kind_; |
| 455 Thread* thread_; | 447 Thread* thread_; |
| 456 const uint8_t* buffer_; | 448 const uint8_t* buffer_; |
| 457 intptr_t size_; | 449 intptr_t size_; |
| 458 const uint8_t* instructions_buffer_; | 450 const uint8_t* instructions_buffer_; |
| 459 const uint8_t* data_buffer_; | 451 const uint8_t* data_buffer_; |
| 460 | 452 |
| 461 DISALLOW_COPY_AND_ASSIGN(FullSnapshotReader); | 453 DISALLOW_COPY_AND_ASSIGN(FullSnapshotReader); |
| 462 }; | 454 }; |
| 463 | 455 |
| 464 } // namespace dart | 456 } // namespace dart |
| 465 | 457 |
| 466 #endif // RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ | 458 #endif // RUNTIME_VM_CLUSTERED_SNAPSHOT_H_ |
| OLD | NEW |