| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index c34d12c0f2d92d107083135ebb15a5944eb36a42..92608521e9e502a82f202aec7bf18dcd300c1819 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -4163,12 +4163,19 @@ int MarkCompactCollector::SweepInParallel(PagedSpace* space,
|
|
|
| int MarkCompactCollector::SweepInParallel(Page* page, PagedSpace* space) {
|
| int max_freed = 0;
|
| - if (page->TryParallelSweeping()) {
|
| + if (page->TryLock()) {
|
| + // If this page was already swept in the meantime, we can return here.
|
| + if (page->parallel_sweeping() != MemoryChunk::SWEEPING_PENDING) {
|
| + page->mutex()->Unlock();
|
| + return 0;
|
| + }
|
| + page->set_parallel_sweeping(MemoryChunk::SWEEPING_IN_PROGRESS);
|
| FreeList* free_list = free_list_old_space_.get();
|
| FreeList private_free_list(space);
|
| max_freed = Sweep<SWEEP_ONLY, SWEEP_IN_PARALLEL, IGNORE_SKIP_LIST,
|
| IGNORE_FREE_SPACE>(space, &private_free_list, page, NULL);
|
| free_list->Concatenate(&private_free_list);
|
| + page->mutex()->Unlock();
|
| }
|
| return max_freed;
|
| }
|
|
|