Index: src/heap/spaces.h |
diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
index ae2f86c32073bd195b377e86e972d997e70767ce..de5ea1b16adc399a977885f4bacffda9c8b22263 100644 |
--- a/src/heap/spaces.h |
+++ b/src/heap/spaces.h |
@@ -1205,7 +1205,12 @@ class MemoryAllocator { |
template <ChunkQueueType type> |
void AddMemoryChunkSafe(MemoryChunk* chunk) { |
base::LockGuard<base::Mutex> guard(&mutex_); |
- chunks_[type].push_back(chunk); |
+ if (type != kRegular || allocator_->CanFreeMemoryChunk(chunk)) { |
+ chunks_[type].push_back(chunk); |
+ } else { |
+ DCHECK_EQ(type, kRegular); |
+ delayed_regular_chunks_.push_back(chunk); |
+ } |
} |
template <ChunkQueueType type> |
@@ -1217,11 +1222,16 @@ class MemoryAllocator { |
return chunk; |
} |
+ void ReconsiderDelayedChunks(); |
void PerformFreeMemoryOnQueuedChunks(); |
base::Mutex mutex_; |
MemoryAllocator* allocator_; |
std::list<MemoryChunk*> chunks_[kNumberOfChunkQueues]; |
+ // Delayed chunks cannot be processed in the current unmapping cycle because |
+ // of dependencies such as an active sweeper. |
+ // See MemoryAllocator::CanFreeMemoryChunk. |
+ std::list<MemoryChunk*> delayed_regular_chunks_; |
base::Semaphore pending_unmapping_tasks_semaphore_; |
intptr_t concurrent_unmapping_tasks_active_; |
@@ -1260,6 +1270,8 @@ class MemoryAllocator { |
template <MemoryAllocator::FreeMode mode = kFull> |
void Free(MemoryChunk* chunk); |
+ bool CanFreeMemoryChunk(MemoryChunk* chunk); |
+ |
// Returns allocated spaces in bytes. |
intptr_t Size() { return size_.Value(); } |