| Index: src/heap/spaces.h
|
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h
|
| index 3c3157ec432241a3cb9c1b92dfa0f35db9d63c63..9a91abb537145b31a128c2a89c703244f1eca360 100644
|
| --- a/src/heap/spaces.h
|
| +++ b/src/heap/spaces.h
|
| @@ -268,19 +268,6 @@
|
| // any heap object.
|
| class MemoryChunk {
|
| public:
|
| - // |kCompactionDone|: Initial compaction state of a |MemoryChunk|.
|
| - // |kCompactingInProgress|: Parallel compaction is currently in progress.
|
| - // |kCompactingFinalize|: Parallel compaction is done but the chunk needs to
|
| - // be finalized.
|
| - // |kCompactingAborted|: Parallel compaction has been aborted, which should
|
| - // for now only happen in OOM scenarios.
|
| - enum ParallelCompactingState {
|
| - kCompactingDone,
|
| - kCompactingInProgress,
|
| - kCompactingFinalize,
|
| - kCompactingAborted,
|
| - };
|
| -
|
| // Only works if the pointer is in the first kPageSize of the MemoryChunk.
|
| static MemoryChunk* FromAddress(Address a) {
|
| return reinterpret_cast<MemoryChunk*>(OffsetFrom(a) & ~kAlignmentMask);
|
| @@ -471,10 +458,6 @@
|
| base::Release_Store(¶llel_sweeping_, state);
|
| }
|
|
|
| - AtomicValue<ParallelCompactingState>& parallel_compaction_state() {
|
| - return parallel_compaction_;
|
| - }
|
| -
|
| bool TryLock() { return mutex_->TryLock(); }
|
|
|
| base::Mutex* mutex() { return mutex_; }
|
| @@ -583,7 +566,6 @@
|
| + kPointerSize // AtomicValue high_water_mark_
|
| + kPointerSize // base::Mutex* mutex_
|
| + kPointerSize // base::AtomicWord parallel_sweeping_
|
| - + kPointerSize // AtomicValue parallel_compaction_
|
| + 5 * kPointerSize // AtomicNumber free-list statistics
|
| + kPointerSize // base::AtomicWord next_chunk_
|
| + kPointerSize; // base::AtomicWord prev_chunk_
|
| @@ -744,7 +726,6 @@
|
|
|
| base::Mutex* mutex_;
|
| base::AtomicWord parallel_sweeping_;
|
| - AtomicValue<ParallelCompactingState> parallel_compaction_;
|
|
|
| // PagedSpace free-list statistics.
|
| AtomicNumber<intptr_t> available_in_small_free_list_;
|
| @@ -1004,6 +985,9 @@
|
| bool CommitRawMemory(Address start, size_t length);
|
| bool UncommitRawMemory(Address start, size_t length);
|
| void FreeRawMemory(Address buf, size_t length);
|
| +
|
| + void ReserveEmergencyBlock();
|
| + void ReleaseEmergencyBlock();
|
|
|
| private:
|
| // Frees the range of virtual memory, and frees the data structures used to
|
| @@ -1047,6 +1031,12 @@
|
| List<FreeBlock> allocation_list_;
|
| int current_allocation_block_index_;
|
|
|
| + // Emergency block guarantees that we can always allocate a page for
|
| + // evacuation candidates when code space is compacted. Emergency block is
|
| + // reserved immediately after GC and is released immedietely before
|
| + // allocating a page for evacuation.
|
| + FreeBlock emergency_block_;
|
| +
|
| // Finds a block on the allocation list that contains at least the
|
| // requested amount of memory. If none is found, sorts and merges
|
| // the existing free memory blocks, and searches again.
|
| @@ -1979,11 +1969,16 @@
|
| // Return size of allocatable area on a page in this space.
|
| inline int AreaSize() { return area_size_; }
|
|
|
| + void CreateEmergencyMemory();
|
| + void FreeEmergencyMemory();
|
| + void UseEmergencyMemory();
|
| + intptr_t MaxEmergencyMemoryAllocated();
|
| +
|
| + bool HasEmergencyMemory() { return emergency_memory_ != NULL; }
|
| +
|
| // Merges {other} into the current space. Note that this modifies {other},
|
| // e.g., removes its bump pointer area and resets statistics.
|
| void MergeCompactionSpace(CompactionSpace* other);
|
| -
|
| - void MoveOverFreeMemory(PagedSpace* other);
|
|
|
| protected:
|
| // PagedSpaces that should be included in snapshots have different, i.e.,
|
| @@ -2044,6 +2039,12 @@
|
| // and sweep these pages concurrently. They will stop sweeping after the
|
| // end_of_unswept_pages_ page.
|
| Page* end_of_unswept_pages_;
|
| +
|
| + // Emergency memory is the memory of a full page for a given space, allocated
|
| + // conservatively before evacuating a page. If compaction fails due to out
|
| + // of memory error the emergency memory can be used to complete compaction.
|
| + // If not used, the emergency memory is released after compaction.
|
| + MemoryChunk* emergency_memory_;
|
|
|
| // Mutex guarding any concurrent access to the space.
|
| base::Mutex space_mutex_;
|
| @@ -2743,32 +2744,6 @@
|
| };
|
|
|
|
|
| -// A collection of |CompactionSpace|s used by a single compaction task.
|
| -class CompactionSpaceCollection : public Malloced {
|
| - public:
|
| - explicit CompactionSpaceCollection(Heap* heap)
|
| - : old_space_(heap, OLD_SPACE, Executability::NOT_EXECUTABLE),
|
| - code_space_(heap, CODE_SPACE, Executability::EXECUTABLE) {}
|
| -
|
| - CompactionSpace* Get(AllocationSpace space) {
|
| - switch (space) {
|
| - case OLD_SPACE:
|
| - return &old_space_;
|
| - case CODE_SPACE:
|
| - return &code_space_;
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| - UNREACHABLE();
|
| - return nullptr;
|
| - }
|
| -
|
| - private:
|
| - CompactionSpace old_space_;
|
| - CompactionSpace code_space_;
|
| -};
|
| -
|
| -
|
| // -----------------------------------------------------------------------------
|
| // Old object space (includes the old space of objects and code space)
|
|
|
|
|