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

Unified Diff: runtime/vm/pages.cc

Issue 1584443002: VM: Precompiled rodata snapshot. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: compute string hash if necessary 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/pages.cc
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index caea245f67de75df0201fe0dd9155d3adcabc02e..ff0fa5385a378d9f84e916bf6e48e45630285b90 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -59,7 +59,7 @@ HeapPage* HeapPage::Initialize(VirtualMemory* memory, PageType type) {
ASSERT(result != NULL);
result->memory_ = memory;
result->next_ = NULL;
- result->executable_ = is_executable;
+ result->type_ = type;
return result;
}
@@ -132,7 +132,7 @@ RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
void HeapPage::WriteProtect(bool read_only) {
VirtualMemory::Protection prot;
if (read_only) {
- if (executable_) {
+ if (type_ == kExecutable) {
prot = VirtualMemory::kReadExecute;
} else {
prot = VirtualMemory::kReadOnly;
@@ -665,7 +665,9 @@ void PageSpace::WriteProtect(bool read_only, bool include_code_pages) {
AbandonBumpAllocation();
}
for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
- if ((it.page()->type() != HeapPage::kExecutable) || include_code_pages) {
+ HeapPage::PageType page_type = it.page()->type();
+ if ((page_type != HeapPage::kReadOnlyData) &&
+ ((page_type != HeapPage::kExecutable) || include_code_pages)) {
it.page()->WriteProtect(read_only);
}
}
@@ -1071,7 +1073,9 @@ uword PageSpace::TryAllocateSmiInitializedLocked(intptr_t size,
}
-void PageSpace::SetupInstructionsSnapshotPage(void* pointer, uword size) {
+void PageSpace::SetupExternalPage(void* pointer,
+ uword size,
+ bool is_executable) {
// Setup a HeapPage so precompiled Instructions can be traversed.
// Instructions are contiguous at [pointer, pointer + size). HeapPage
// expects to find objects at [memory->start() + ObjectStartOffset,
@@ -1080,23 +1084,31 @@ void PageSpace::SetupInstructionsSnapshotPage(void* pointer, uword size) {
pointer = reinterpret_cast<void*>(reinterpret_cast<uword>(pointer) - offset);
size += offset;
- ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
-
- VirtualMemory* memory = VirtualMemory::ForInstructionsSnapshot(pointer, size);
+ VirtualMemory* memory = VirtualMemory::ForExternalPage(pointer, size);
ASSERT(memory != NULL);
HeapPage* page = reinterpret_cast<HeapPage*>(malloc(sizeof(HeapPage)));
page->memory_ = memory;
page->next_ = NULL;
page->object_end_ = memory->end();
- page->executable_ = true;
MutexLocker ml(pages_lock_);
- if (exec_pages_ == NULL) {
- exec_pages_ = page;
+ HeapPage** first, **tail;
+ if (is_executable) {
+ ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
+ page->type_ = HeapPage::kExecutable;
+ first = &exec_pages_;
+ tail = &exec_pages_tail_;
+ } else {
+ page->type_ = HeapPage::kReadOnlyData;
+ first = &pages_;
+ tail = &pages_tail_;
+ }
+ if (*first == NULL) {
+ *first = page;
} else {
- exec_pages_tail_->set_next(page);
+ (*tail)->set_next(page);
}
- exec_pages_tail_ = page;
+ (*tail) = page;
}
« no previous file with comments | « runtime/vm/pages.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698