Index: src/spaces.cc |
=================================================================== |
--- src/spaces.cc (revision 8679) |
+++ src/spaces.cc (working copy) |
@@ -402,7 +402,9 @@ |
size_t length, |
Executability executable) { |
#ifdef DEBUG |
- ZapBlock(reinterpret_cast<Address>(mem), length); |
+ // Do not try to zap the guard page. |
+ size_t guardsize = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
+ ZapBlock(reinterpret_cast<Address>(mem) + guardsize, length - guardsize); |
#endif |
if (isolate_->code_range()->contains(static_cast<Address>(mem))) { |
isolate_->code_range()->FreeRawMemory(mem, length); |
@@ -503,15 +505,27 @@ |
if (chunk == NULL) return Page::FromAddress(NULL); |
LOG(isolate_, NewEvent("PagedChunk", chunk, chunk_size)); |
+ size_t guardsize = (owner->executable() == EXECUTABLE) ? Page::kPageSize : 0; |
+ |
*allocated_pages = PagesInChunk(static_cast<Address>(chunk), chunk_size); |
- // We may 'lose' a page due to alignment. |
- ASSERT(*allocated_pages >= kPagesPerChunk - 1); |
- if (*allocated_pages == 0) { |
- FreeRawMemory(chunk, chunk_size, owner->executable()); |
+ // We may 'lose' a page due to alignment or for a guard page. |
+ ASSERT(*allocated_pages >= |
+ kPagesPerChunk - ((guardsize ? 1 : 0) + 1)); |
Mads Ager (chromium)
2011/07/20 07:24:16
Now that you have move the fiddling with the chunk
|
+ if (*allocated_pages <= (guardsize ? 1 : 0)) { |
+ FreeRawMemory(chunk, |
+ chunk_size, |
+ owner->executable()); |
LOG(isolate_, DeleteEvent("PagedChunk", chunk)); |
return Page::FromAddress(NULL); |
} |
+ if (guardsize != 0) { |
+ OS::Guard(chunk, guardsize); |
+ chunk_size -= guardsize; |
+ chunk = static_cast<Address>(chunk) + guardsize; |
+ --*allocated_pages; |
+ } |
+ |
int chunk_id = Pop(); |
chunks_[chunk_id].init(static_cast<Address>(chunk), chunk_size, owner); |
@@ -681,7 +695,8 @@ |
LOG(isolate_, DeleteEvent("PagedChunk", c.address())); |
ObjectSpace space = static_cast<ObjectSpace>(1 << c.owner_identity()); |
size_t size = c.size(); |
- FreeRawMemory(c.address(), size, c.executable()); |
+ size_t guardsize = (c.executable() == EXECUTABLE) ? Page::kPageSize : 0; |
+ FreeRawMemory(c.address() - guardsize, size + guardsize, c.executable()); |
PerformAllocationCallback(space, kAllocationActionFree, size); |
} |
c.init(NULL, 0, NULL); |
@@ -2672,9 +2687,10 @@ |
Executability executable) { |
size_t requested = ChunkSizeFor(size_in_bytes); |
size_t size; |
+ size_t guardsize = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
Isolate* isolate = Isolate::Current(); |
void* mem = isolate->memory_allocator()->AllocateRawMemory( |
- requested, &size, executable); |
+ requested + guardsize, &size, executable); |
if (mem == NULL) return NULL; |
// The start of the chunk may be overlayed with a page so we have to |
@@ -2682,13 +2698,19 @@ |
ASSERT((size & Page::kPageFlagMask) == 0); |
LOG(isolate, NewEvent("LargeObjectChunk", mem, size)); |
- if (size < requested) { |
+ if (size < requested + guardsize) { |
isolate->memory_allocator()->FreeRawMemory( |
mem, size, executable); |
LOG(isolate, DeleteEvent("LargeObjectChunk", mem)); |
return NULL; |
} |
+ if (guardsize != 0) { |
+ OS::Guard(mem, guardsize); |
+ size -= guardsize; |
+ mem = static_cast<Address>(mem) + guardsize; |
+ } |
+ |
ObjectSpace space = (executable == EXECUTABLE) |
? kObjectSpaceCodeSpace |
: kObjectSpaceLoSpace; |
@@ -2742,9 +2764,11 @@ |
ObjectSpace space = kObjectSpaceLoSpace; |
if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; |
size_t size = chunk->size(); |
- heap()->isolate()->memory_allocator()->FreeRawMemory(chunk->address(), |
- size, |
- executable); |
+ size_t guardsize = (executable == EXECUTABLE) ? Page::kPageSize : 0; |
+ heap()->isolate()->memory_allocator()->FreeRawMemory( |
+ chunk->address() - guardsize, |
+ size + guardsize, |
+ executable); |
heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
space, kAllocationActionFree, size); |
} |
@@ -2941,10 +2965,15 @@ |
objects_size_ -= object->Size(); |
page_count_--; |
ObjectSpace space = kObjectSpaceLoSpace; |
- if (executable == EXECUTABLE) space = kObjectSpaceCodeSpace; |
- heap()->isolate()->memory_allocator()->FreeRawMemory(chunk_address, |
- chunk_size, |
- executable); |
+ size_t guardsize = 0; |
+ if (executable == EXECUTABLE) { |
+ space = kObjectSpaceCodeSpace; |
+ guardsize = Page::kPageSize; |
+ } |
+ heap()->isolate()->memory_allocator()->FreeRawMemory( |
+ chunk_address - guardsize, |
+ chunk_size + guardsize, |
+ executable); |
heap()->isolate()->memory_allocator()->PerformAllocationCallback( |
space, kAllocationActionFree, size_); |
LOG(heap()->isolate(), DeleteEvent("LargeObjectChunk", chunk_address)); |