Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index 1f8194562a1e9ed948d8d9caff464ee43622d4c1..c72c8b0b0933c48e68134aa40d655f0337f40aa6 100644 |
--- a/src/heap/spaces.cc |
+++ b/src/heap/spaces.cc |
@@ -163,6 +163,8 @@ bool CodeRange::GetNextAllocationBlock(size_t requested) { |
} |
} |
+ base::LockGuard<base::Mutex> free_list_lock_guard(&free_list_mutex_); |
Michael Lippautz
2015/08/24 13:43:12
Please add a block to make clear which parts are t
Hannes Payer (out of office)
2015/08/24 14:58:13
I would have just locked the rest of the function,
|
+ |
// Sort and merge the free blocks on the free list and the allocation list. |
free_list_.AddAll(allocation_list_); |
allocation_list_.Clear(); |
@@ -229,6 +231,7 @@ bool CodeRange::UncommitRawMemory(Address start, size_t length) { |
void CodeRange::FreeRawMemory(Address address, size_t length) { |
DCHECK(IsAddressAligned(address, MemoryChunk::kAlignment)); |
+ base::LockGuard<base::Mutex> free_list_lock_guard(&free_list_mutex_); |
free_list_.Add(FreeBlock(address, length)); |
code_range_->Uncommit(address, length); |
} |
@@ -237,6 +240,7 @@ void CodeRange::FreeRawMemory(Address address, size_t length) { |
void CodeRange::TearDown() { |
delete code_range_; // Frees all memory in the virtual memory range. |
code_range_ = NULL; |
+ base::LockGuard<base::Mutex> free_list_lock_guard(&free_list_mutex_); |
free_list_.Free(); |
allocation_list_.Free(); |
} |
@@ -264,7 +268,10 @@ bool CodeRange::ReserveBlock(const size_t requested_size, FreeBlock* block) { |
} |
-void CodeRange::ReleaseBlock(const FreeBlock* block) { free_list_.Add(*block); } |
+void CodeRange::ReleaseBlock(const FreeBlock* block) { |
+ base::LockGuard<base::Mutex> free_list_lock_guard(&free_list_mutex_); |
+ free_list_.Add(*block); |
+} |
void CodeRange::ReserveEmergencyBlock() { |
@@ -332,26 +339,30 @@ bool MemoryAllocator::CommitMemory(Address base, size_t size, |
} |
-void MemoryAllocator::FreeMemory(base::VirtualMemory* reservation, |
- Executability executable) { |
- // TODO(gc) make code_range part of memory allocator? |
+void MemoryAllocator::FreeNewSpaceMemory(Address addr, |
+ base::VirtualMemory* reservation, |
+ Executability executable) { |
+ LOG(isolate_, DeleteEvent("InitialChunk", addr)); |
Michael Lippautz
2015/08/24 13:43:12
"InitialChunk"?
Hannes Payer (out of office)
2015/08/24 14:58:13
This was the original string. We can change it to
|
+ |
DCHECK(reservation->IsReserved()); |
size_t size = reservation->size(); |
Michael Lippautz
2015/08/24 13:43:12
const size_t size = ..
Hannes Payer (out of office)
2015/08/24 14:58:13
Done.
|
DCHECK(size_ >= size); |
size_ -= size; |
- |
isolate_->counters()->memory_allocated()->Decrement(static_cast<int>(size)); |
+ FreeMemory(reservation, NOT_EXECUTABLE); |
+} |
- if (executable == EXECUTABLE) { |
- DCHECK(size_executable_ >= size); |
- size_executable_ -= size; |
- } |
+ |
+void MemoryAllocator::FreeMemory(base::VirtualMemory* reservation, |
+ Executability executable) { |
+ // TODO(gc) make code_range part of memory allocator? |
// Code which is part of the code-range does not have its own VirtualMemory. |
DCHECK(isolate_->code_range() == NULL || |
!isolate_->code_range()->contains( |
static_cast<Address>(reservation->address()))); |
DCHECK(executable == NOT_EXECUTABLE || isolate_->code_range() == NULL || |
- !isolate_->code_range()->valid() || size <= Page::kPageSize); |
+ !isolate_->code_range()->valid() || |
+ reservation->size() <= Page::kPageSize); |
reservation->Release(); |
} |
@@ -360,15 +371,6 @@ void MemoryAllocator::FreeMemory(base::VirtualMemory* reservation, |
void MemoryAllocator::FreeMemory(Address base, size_t size, |
Executability executable) { |
// TODO(gc) make code_range part of memory allocator? |
- DCHECK(size_ >= size); |
- size_ -= size; |
- |
- isolate_->counters()->memory_allocated()->Decrement(static_cast<int>(size)); |
- |
- if (executable == EXECUTABLE) { |
- DCHECK(size_executable_ >= size); |
- size_executable_ -= size; |
- } |
if (isolate_->code_range() != NULL && |
isolate_->code_range()->contains(static_cast<Address>(base))) { |
DCHECK(executable == EXECUTABLE); |
@@ -742,7 +744,7 @@ LargePage* MemoryAllocator::AllocateLargePage(intptr_t object_size, |
} |
-void MemoryAllocator::Free(MemoryChunk* chunk) { |
+void MemoryAllocator::PreFreeMemory(MemoryChunk* chunk) { |
Michael Lippautz
2015/08/24 13:43:12
Should we add a flag to {MemoryChunk} indicating t
Hannes Payer (out of office)
2015/08/24 14:58:13
Good idea. Done.
|
LOG(isolate_, DeleteEvent("MemoryChunk", chunk)); |
if (chunk->owner() != NULL) { |
ObjectSpace space = |
@@ -753,6 +755,25 @@ void MemoryAllocator::Free(MemoryChunk* chunk) { |
isolate_->heap()->RememberUnmappedPage(reinterpret_cast<Address>(chunk), |
chunk->IsEvacuationCandidate()); |
+ size_t size; |
+ base::VirtualMemory* reservation = chunk->reserved_memory(); |
+ if (reservation->IsReserved()) { |
+ size = reservation->size(); |
+ } else { |
+ size = chunk->size(); |
+ } |
+ DCHECK(size_ >= size); |
+ size_ -= size; |
+ isolate_->counters()->memory_allocated()->Decrement(static_cast<int>(size)); |
+ |
+ if (chunk->executable() == EXECUTABLE) { |
+ DCHECK(size_executable_ >= size); |
+ size_executable_ -= size; |
+ } |
+} |
+ |
+ |
+void MemoryAllocator::PerformFreeMemory(MemoryChunk* chunk) { |
Michael Lippautz
2015/08/24 13:43:12
We could make this a static on {MemoryChunk}.
{M
Hannes Payer (out of office)
2015/08/24 14:58:13
As discussed offline, this method should not be st
|
delete chunk->slots_buffer(); |
delete chunk->skip_list(); |
delete chunk->mutex(); |
@@ -766,6 +787,12 @@ void MemoryAllocator::Free(MemoryChunk* chunk) { |
} |
+void MemoryAllocator::Free(MemoryChunk* chunk) { |
+ PreFreeMemory(chunk); |
+ PerformFreeMemory(chunk); |
+} |
+ |
+ |
bool MemoryAllocator::CommitBlock(Address start, size_t size, |
Executability executable) { |
if (!CommitMemory(start, size, executable)) return false; |
@@ -1284,11 +1311,9 @@ void NewSpace::TearDown() { |
to_space_.TearDown(); |
from_space_.TearDown(); |
- LOG(heap()->isolate(), DeleteEvent("InitialChunk", chunk_base_)); |
+ heap()->isolate()->memory_allocator()->FreeNewSpaceMemory( |
+ chunk_base_, &reservation_, NOT_EXECUTABLE); |
- DCHECK(reservation_.IsReserved()); |
- heap()->isolate()->memory_allocator()->FreeMemory(&reservation_, |
- NOT_EXECUTABLE); |
chunk_base_ = NULL; |
chunk_size_ = 0; |
} |