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

Unified Diff: runtime/vm/snapshot.h

Issue 1123813002: Move symbol table from per isolate snapshot to vm isolate snapshot, this reduces the per isolate in… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/service_test.cc ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/snapshot.h
===================================================================
--- runtime/vm/snapshot.h (revision 45789)
+++ runtime/vm/snapshot.h (working copy)
@@ -239,16 +239,29 @@
};
+class BackRefNode : public ValueObject {
+ public:
+ BackRefNode(Object* reference, DeserializeState state)
+ : reference_(reference), state_(state) {}
+ Object* reference() const { return reference_; }
+ bool is_deserialized() const { return state_ == kIsDeserialized; }
+ void set_state(DeserializeState state) { state_ = state; }
+
+ BackRefNode& operator=(const BackRefNode& other) {
+ reference_ = other.reference_;
+ state_ = other.state_;
+ return *this;
+ }
+
+ private:
+ Object* reference_;
+ DeserializeState state_;
+};
+
+
// Reads a snapshot into objects.
class SnapshotReader : public BaseReader {
public:
- SnapshotReader(const uint8_t* buffer,
- intptr_t size,
- Snapshot::Kind kind,
- Isolate* isolate,
- Zone* zone);
- ~SnapshotReader() { }
-
Zone* zone() const { return zone_; }
Isolate* isolate() const { return isolate_; }
Heap* heap() const { return heap_; }
@@ -262,6 +275,7 @@
Array* TokensHandle() { return &tokens_; }
TokenStream* StreamHandle() { return &stream_; }
ExternalTypedData* DataHandle() { return &data_; }
+ Snapshot::Kind kind() const { return kind_; }
// Reads an object.
RawObject* ReadObject();
@@ -323,28 +337,22 @@
RawObject* NewInteger(int64_t value);
RawStacktrace* NewStacktrace();
- private:
- class BackRefNode : public ValueObject {
- public:
- BackRefNode(Object* reference, DeserializeState state)
- : reference_(reference), state_(state) {}
- Object* reference() const { return reference_; }
- bool is_deserialized() const { return state_ == kIsDeserialized; }
- void set_state(DeserializeState state) { state_ = state; }
+ protected:
+ SnapshotReader(const uint8_t* buffer,
+ intptr_t size,
+ Snapshot::Kind kind,
+ ZoneGrowableArray<BackRefNode>* backward_references,
+ Isolate* isolate,
+ Zone* zone);
+ ~SnapshotReader() { }
- BackRefNode& operator=(const BackRefNode& other) {
- reference_ = other.reference_;
- state_ = other.state_;
- return *this;
- }
-
- private:
- Object* reference_;
- DeserializeState state_;
- };
-
+ ZoneGrowableArray<BackRefNode>* GetBackwardReferenceTable() const {
+ return backward_references_;
+ }
+ void ResetBackwardReferenceTable() { backward_references_ = NULL; }
PageSpace* old_space() const { return old_space_; }
+ private:
// Allocate uninitialized objects, this is used when reading a full snapshot.
RawObject* AllocateUninitialized(intptr_t class_id, intptr_t size);
@@ -373,6 +381,8 @@
void SetReadException(const char* msg);
+ RawObject* VmIsolateSnapshotObject(intptr_t index) const;
+
Snapshot::Kind kind_; // Indicates type of snapshot(full, script, message).
Isolate* isolate_; // Current isolate.
Zone* zone_; // Zone for allocations while reading snapshot.
@@ -391,7 +401,8 @@
TokenStream& stream_; // Temporary token stream handle.
ExternalTypedData& data_; // Temporary stream data handle.
UnhandledException& error_; // Error handle.
- GrowableArray<BackRefNode> backward_references_;
+ intptr_t max_vm_isolate_object_id_;
+ ZoneGrowableArray<BackRefNode>* backward_references_;
friend class ApiError;
friend class Array;
@@ -430,6 +441,57 @@
};
+class VmIsolateSnapshotReader : public SnapshotReader {
+ public:
+ VmIsolateSnapshotReader(const uint8_t* buffer, intptr_t size, Zone* zone);
+ ~VmIsolateSnapshotReader();
+
+ RawApiError* ReadVmIsolateSnapshot();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(VmIsolateSnapshotReader);
+};
+
+
+class IsolateSnapshotReader : public SnapshotReader {
+ public:
+ IsolateSnapshotReader(const uint8_t* buffer,
+ intptr_t size,
+ Isolate* isolate,
+ Zone* zone);
+ ~IsolateSnapshotReader();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(IsolateSnapshotReader);
+};
+
+
+class ScriptSnapshotReader : public SnapshotReader {
+ public:
+ ScriptSnapshotReader(const uint8_t* buffer,
+ intptr_t size,
+ Isolate* isolate,
+ Zone* zone);
+ ~ScriptSnapshotReader();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotReader);
+};
+
+
+class MessageSnapshotReader : public SnapshotReader {
+ public:
+ MessageSnapshotReader(const uint8_t* buffer,
+ intptr_t size,
+ Isolate* isolate,
+ Zone* zone);
+ ~MessageSnapshotReader();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MessageSnapshotReader);
+};
+
+
class BaseWriter : public StackResource {
public:
// Size of the snapshot.
@@ -565,6 +627,7 @@
GrowableArray<Node*> nodes_;
intptr_t first_unprocessed_object_id_;
+ friend class FullSnapshotWriter;
DISALLOW_COPY_AND_ASSIGN(ForwardList);
};
@@ -575,6 +638,7 @@
uint8_t** buffer,
ReAlloc alloc,
intptr_t initial_size,
+ ForwardList* forward_list,
bool can_send_any_object);
public:
@@ -602,10 +666,12 @@
// Write a version string for the snapshot.
void WriteVersion();
+ static intptr_t FirstObjectId();
+
protected:
void UnmarkAll() {
- if (!unmarked_objects_) {
- forward_list_.UnmarkAll();
+ if (!unmarked_objects_ && forward_list_ != NULL) {
+ forward_list_->UnmarkAll();
unmarked_objects_ = true;
}
}
@@ -637,7 +703,17 @@
intptr_t tags);
void WriteInstanceRef(RawObject* raw, RawClass* cls);
bool AllowObjectsInDartLibrary(RawLibrary* library);
+ intptr_t FindVmSnapshotObject(RawObject* rawobj);
+ void InitializeForwardList(ForwardList* forward_list) {
+ ASSERT(forward_list_ == NULL);
+ forward_list_ = forward_list;
+ }
+ void ResetForwardList() {
+ ASSERT(forward_list_ != NULL);
+ forward_list_ = NULL;
+ }
+
Isolate* isolate() const { return isolate_; }
ObjectStore* object_store() const { return object_store_; }
@@ -646,12 +722,13 @@
Isolate* isolate_;
ObjectStore* object_store_; // Object store for common classes.
ClassTable* class_table_; // Class table for the class index to class lookup.
- ForwardList forward_list_;
+ ForwardList* forward_list_;
Exceptions::ExceptionType exception_type_; // Exception type.
const char* exception_msg_; // Message associated with exception.
bool unmarked_objects_; // True if marked objects have been unmarked.
bool can_send_any_object_; // True if any Dart instance can be sent.
+ friend class FullSnapshotWriter;
friend class RawArray;
friend class RawClass;
friend class RawClosureData;
@@ -674,30 +751,46 @@
};
-class FullSnapshotWriter : public SnapshotWriter {
+class FullSnapshotWriter {
public:
static const intptr_t kInitialSize = 64 * KB;
FullSnapshotWriter(uint8_t** vm_isolate_snapshot_buffer,
uint8_t** isolate_snapshot_buffer,
- ReAlloc alloc)
- : SnapshotWriter(Snapshot::kFull,
- isolate_snapshot_buffer,
- alloc,
- kInitialSize,
- true) {
- ASSERT(vm_isolate_snapshot_buffer != NULL);
- ASSERT(isolate_snapshot_buffer != NULL);
- ASSERT(alloc != NULL);
- }
+ ReAlloc alloc);
~FullSnapshotWriter() { }
+ uint8_t** vm_isolate_snapshot_buffer() {
+ return vm_isolate_snapshot_buffer_;
+ }
+
+ uint8_t** isolate_snapshot_buffer() {
+ return isolate_snapshot_buffer_;
+ }
+
// Writes a full snapshot of the Isolate.
void WriteFullSnapshot();
- intptr_t VmIsolateSnapshotSize() const { return 0; }
- intptr_t IsolateSnapshotSize() const { return BytesWritten(); }
+ intptr_t VmIsolateSnapshotSize() const {
+ return vm_isolate_snapshot_size_;
+ }
+ intptr_t IsolateSnapshotSize() const {
+ return isolate_snapshot_size_;
+ }
private:
+ // Writes a snapshot of the VM Isolate.
+ void WriteVmIsolateSnapshot();
+
+ // Writes a full snapshot of a regular Dart Isolate.
+ void WriteIsolateFullSnapshot();
+
+ uint8_t** vm_isolate_snapshot_buffer_;
+ uint8_t** isolate_snapshot_buffer_;
+ ReAlloc alloc_;
+ intptr_t vm_isolate_snapshot_size_;
+ intptr_t isolate_snapshot_size_;
+ ForwardList forward_list_;
+
DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter);
};
@@ -705,11 +798,7 @@
class ScriptSnapshotWriter : public SnapshotWriter {
public:
static const intptr_t kInitialSize = 64 * KB;
- ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc)
- : SnapshotWriter(Snapshot::kScript, buffer, alloc, kInitialSize, true) {
- ASSERT(buffer != NULL);
- ASSERT(alloc != NULL);
- }
+ ScriptSnapshotWriter(uint8_t** buffer, ReAlloc alloc);
~ScriptSnapshotWriter() { }
// Writes a partial snapshot of the script.
@@ -716,6 +805,8 @@
void WriteScriptSnapshot(const Library& lib);
private:
+ ForwardList forward_list_;
+
DISALLOW_COPY_AND_ASSIGN(ScriptSnapshotWriter);
};
@@ -723,20 +814,14 @@
class MessageWriter : public SnapshotWriter {
public:
static const intptr_t kInitialSize = 512;
- MessageWriter(uint8_t** buffer, ReAlloc alloc, bool can_send_any_object)
- : SnapshotWriter(Snapshot::kMessage,
- buffer,
- alloc,
- kInitialSize,
- can_send_any_object) {
- ASSERT(buffer != NULL);
- ASSERT(alloc != NULL);
- }
+ MessageWriter(uint8_t** buffer, ReAlloc alloc, bool can_send_any_object);
~MessageWriter() { }
void WriteMessage(const Object& obj);
private:
+ ForwardList forward_list_;
+
DISALLOW_COPY_AND_ASSIGN(MessageWriter);
};
« no previous file with comments | « runtime/vm/service_test.cc ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698