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

Side by Side Diff: runtime/vm/dart.cc

Issue 1584443002: VM: Precompiled rodata snapshot. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: added read-only page type Created 4 years, 10 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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 #include "vm/dart.h" 5 #include "vm/dart.h"
6 6
7 #include "vm/code_observers.h" 7 #include "vm/code_observers.h"
8 #include "vm/cpu.h" 8 #include "vm/cpu.h"
9 #include "vm/dart_api_state.h" 9 #include "vm/dart_api_state.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 30 matching lines...) Expand all
41 DECLARE_FLAG(bool, pause_isolates_on_exit); 41 DECLARE_FLAG(bool, pause_isolates_on_exit);
42 DEFINE_FLAG(bool, keep_code, false, 42 DEFINE_FLAG(bool, keep_code, false,
43 "Keep deoptimized code for profiling."); 43 "Keep deoptimized code for profiling.");
44 DEFINE_FLAG(bool, shutdown, true, "Do a clean shutdown of the VM"); 44 DEFINE_FLAG(bool, shutdown, true, "Do a clean shutdown of the VM");
45 45
46 Isolate* Dart::vm_isolate_ = NULL; 46 Isolate* Dart::vm_isolate_ = NULL;
47 ThreadPool* Dart::thread_pool_ = NULL; 47 ThreadPool* Dart::thread_pool_ = NULL;
48 DebugInfo* Dart::pprof_symbol_generator_ = NULL; 48 DebugInfo* Dart::pprof_symbol_generator_ = NULL;
49 ReadOnlyHandles* Dart::predefined_handles_ = NULL; 49 ReadOnlyHandles* Dart::predefined_handles_ = NULL;
50 const uint8_t* Dart::instructions_snapshot_buffer_ = NULL; 50 const uint8_t* Dart::instructions_snapshot_buffer_ = NULL;
51 const uint8_t* Dart::data_snapshot_buffer_ = NULL;
51 52
52 // Structure for managing read-only global handles allocation used for 53 // Structure for managing read-only global handles allocation used for
53 // creating global read-only handles that are pre created and initialized 54 // creating global read-only handles that are pre created and initialized
54 // for use across all isolates. Having these global pre created handles 55 // for use across all isolates. Having these global pre created handles
55 // stored in the vm isolate ensures that we don't constantly create and 56 // stored in the vm isolate ensures that we don't constantly create and
56 // destroy handles for read-only objects referred in the VM code 57 // destroy handles for read-only objects referred in the VM code
57 // (e.g: symbols, null object, empty array etc.) 58 // (e.g: symbols, null object, empty array etc.)
58 // The ReadOnlyHandles C++ Wrapper around VMHandles which is a ValueObject is 59 // The ReadOnlyHandles C++ Wrapper around VMHandles which is a ValueObject is
59 // to ensure that the handles area is not trashed by automatic running of C++ 60 // to ensure that the handles area is not trashed by automatic running of C++
60 // static destructors when 'exit()" is called by any isolate. There might be 61 // static destructors when 'exit()" is called by any isolate. There might be
61 // other isolates running at the same time and trashing the handles area will 62 // other isolates running at the same time and trashing the handles area will
62 // have unintended consequences. 63 // have unintended consequences.
63 class ReadOnlyHandles { 64 class ReadOnlyHandles {
64 public: 65 public:
65 ReadOnlyHandles() { } 66 ReadOnlyHandles() { }
66 67
67 private: 68 private:
68 VMHandles handles_; 69 VMHandles handles_;
69 LocalHandles api_handles_; 70 LocalHandles api_handles_;
70 71
71 friend class Dart; 72 friend class Dart;
72 DISALLOW_COPY_AND_ASSIGN(ReadOnlyHandles); 73 DISALLOW_COPY_AND_ASSIGN(ReadOnlyHandles);
73 }; 74 };
74 75
75 76
76 const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, 77 const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot,
77 const uint8_t* instructions_snapshot, 78 const uint8_t* instructions_snapshot,
79 const uint8_t* data_snapshot,
78 Dart_IsolateCreateCallback create, 80 Dart_IsolateCreateCallback create,
79 Dart_IsolateShutdownCallback shutdown, 81 Dart_IsolateShutdownCallback shutdown,
80 Dart_FileOpenCallback file_open, 82 Dart_FileOpenCallback file_open,
81 Dart_FileReadCallback file_read, 83 Dart_FileReadCallback file_read,
82 Dart_FileWriteCallback file_write, 84 Dart_FileWriteCallback file_write,
83 Dart_FileCloseCallback file_close, 85 Dart_FileCloseCallback file_close,
84 Dart_EntropySource entropy_source, 86 Dart_EntropySource entropy_source,
85 Dart_GetVMServiceAssetsArchive get_service_assets) { 87 Dart_GetVMServiceAssetsArchive get_service_assets) {
86 // TODO(iposva): Fix race condition here. 88 // TODO(iposva): Fix race condition here.
87 if (vm_isolate_ != NULL || !Flags::Initialized()) { 89 if (vm_isolate_ != NULL || !Flags::Initialized()) {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 Object::InitOnce(vm_isolate_); 150 Object::InitOnce(vm_isolate_);
149 ArgumentsDescriptor::InitOnce(); 151 ArgumentsDescriptor::InitOnce();
150 ICData::InitOnce(); 152 ICData::InitOnce();
151 // When precompiled the stub code is initialized from the snapshot. 153 // When precompiled the stub code is initialized from the snapshot.
152 if (!precompiled) { 154 if (!precompiled) {
153 StubCode::InitOnce(); 155 StubCode::InitOnce();
154 } 156 }
155 if (vm_isolate_snapshot != NULL) { 157 if (vm_isolate_snapshot != NULL) {
156 if (instructions_snapshot != NULL) { 158 if (instructions_snapshot != NULL) {
157 vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot); 159 vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
160 ASSERT(data_snapshot != NULL);
161 vm_isolate_->SetupDataSnapshotPage(data_snapshot);
158 } 162 }
159 const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot); 163 const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
160 if (snapshot == NULL) { 164 if (snapshot == NULL) {
161 return "Invalid vm isolate snapshot seen."; 165 return "Invalid vm isolate snapshot seen.";
162 } 166 }
163 ASSERT(snapshot->kind() == Snapshot::kFull); 167 ASSERT(snapshot->kind() == Snapshot::kFull);
164 VmIsolateSnapshotReader reader(snapshot->content(), 168 VmIsolateSnapshotReader reader(snapshot->content(),
165 snapshot->length(), 169 snapshot->length(),
166 instructions_snapshot, 170 instructions_snapshot,
171 data_snapshot,
167 T); 172 T);
168 const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot()); 173 const Error& error = Error::Handle(reader.ReadVmIsolateSnapshot());
169 if (!error.IsNull()) { 174 if (!error.IsNull()) {
170 return error.ToCString(); 175 return error.ToCString();
171 } 176 }
172 if (FLAG_trace_isolates) { 177 if (FLAG_trace_isolates) {
173 OS::Print("Size of vm isolate snapshot = %" Pd "\n", 178 OS::Print("Size of vm isolate snapshot = %" Pd "\n",
174 snapshot->length()); 179 snapshot->length());
175 vm_isolate_->heap()->PrintSizes(); 180 vm_isolate_->heap()->PrintSizes();
176 MegamorphicCacheTable::PrintSizes(vm_isolate_); 181 MegamorphicCacheTable::PrintSizes(vm_isolate_);
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 String::New("Invalid snapshot.")); 358 String::New("Invalid snapshot."));
354 return ApiError::New(message); 359 return ApiError::New(message);
355 } 360 }
356 ASSERT(snapshot->kind() == Snapshot::kFull); 361 ASSERT(snapshot->kind() == Snapshot::kFull);
357 if (FLAG_trace_isolates) { 362 if (FLAG_trace_isolates) {
358 OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length()); 363 OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length());
359 } 364 }
360 IsolateSnapshotReader reader(snapshot->content(), 365 IsolateSnapshotReader reader(snapshot->content(),
361 snapshot->length(), 366 snapshot->length(),
362 Dart::instructions_snapshot_buffer(), 367 Dart::instructions_snapshot_buffer(),
368 Dart::data_snapshot_buffer(),
363 T); 369 T);
364 const Error& error = Error::Handle(reader.ReadFullSnapshot()); 370 const Error& error = Error::Handle(reader.ReadFullSnapshot());
365 if (!error.IsNull()) { 371 if (!error.IsNull()) {
366 return error.raw(); 372 return error.raw();
367 } 373 }
368 if (FLAG_trace_isolates) { 374 if (FLAG_trace_isolates) {
369 I->heap()->PrintSizes(); 375 I->heap()->PrintSizes();
370 MegamorphicCacheTable::PrintSizes(I); 376 MegamorphicCacheTable::PrintSizes(I);
371 } 377 }
372 } else { 378 } else {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 return predefined_handles_->handles_.IsValidScopedHandle(address); 491 return predefined_handles_->handles_.IsValidScopedHandle(address);
486 } 492 }
487 493
488 494
489 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { 495 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) {
490 ASSERT(predefined_handles_ != NULL); 496 ASSERT(predefined_handles_ != NULL);
491 return predefined_handles_->api_handles_.IsValidHandle(handle); 497 return predefined_handles_->api_handles_.IsValidHandle(handle);
492 } 498 }
493 499
494 } // namespace dart 500 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698