@ -9,6 +9,7 @@
# include "src/base/atomicops.h"
# include "src/base/atomicops.h"
# include "src/base/bits.h"
# include "src/base/bits.h"
# include "src/base/sys-info.h"
# include "src/base/sys-info.h"
# include "src/cancelable-task.h"
# include "src/code-stubs.h"
# include "src/code-stubs.h"
# include "src/compilation-cache.h"
# include "src/compilation-cache.h"
# include "src/deoptimizer.h"
# include "src/deoptimizer.h"
@ -569,12 +570,14 @@ void MarkCompactCollector::ClearMarkbits() {
heap_ - > lo_space ( ) - > ClearMarkingStateOfLiveObjects ( ) ;
heap_ - > lo_space ( ) - > ClearMarkingStateOfLiveObjects ( ) ;
}
}
class MarkCompactCollector : : Sweeper : : SweeperTask : public v8 : : Task {
class MarkCompactCollector : : Sweeper : : SweeperTask final : public Cancelable Task {
public :
public :
SweeperTask ( Sweeper * sweeper , base : : Semaphore * pending_sweeper_tasks ,
SweeperTask ( Isolate * isolate , Sweeper * sweeper ,
base : : Semaphore * pending_sweeper_tasks ,
base : : AtomicNumber < intptr_t > * num_sweeping_tasks ,
base : : AtomicNumber < intptr_t > * num_sweeping_tasks ,
AllocationSpace space_to_start )
AllocationSpace space_to_start )
: sweeper_ ( sweeper ) ,
: CancelableTask ( isolate ) ,
sweeper_ ( sweeper ) ,
pending_sweeper_tasks_ ( pending_sweeper_tasks ) ,
pending_sweeper_tasks_ ( pending_sweeper_tasks ) ,
num_sweeping_tasks_ ( num_sweeping_tasks ) ,
num_sweeping_tasks_ ( num_sweeping_tasks ) ,
space_to_start_ ( space_to_start ) { }
space_to_start_ ( space_to_start ) { }
@ -582,8 +585,7 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
virtual ~ SweeperTask ( ) { }
virtual ~ SweeperTask ( ) { }
private :
private :
// v8::Task overrides.
void RunInternal ( ) final {
void Run ( ) override {
DCHECK_GE ( space_to_start_ , FIRST_SPACE ) ;
DCHECK_GE ( space_to_start_ , FIRST_SPACE ) ;
DCHECK_LE ( space_to_start_ , LAST_PAGED_SPACE ) ;
DCHECK_LE ( space_to_start_ , LAST_PAGED_SPACE ) ;
const int offset = space_to_start_ - FIRST_SPACE ;
const int offset = space_to_start_ - FIRST_SPACE ;
@ -598,9 +600,9 @@ class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task {
pending_sweeper_tasks_ - > Signal ( ) ;
pending_sweeper_tasks_ - > Signal ( ) ;
}
}
Sweeper * sweeper_ ;
Sweeper * const sweeper_ ;
base : : Semaphore * pending_sweeper_tasks_ ;
base : : Semaphore * const pending_sweeper_tasks_ ;
base : : AtomicNumber < intptr_t > * num_sweeping_tasks_ ;
base : : AtomicNumber < intptr_t > * const num_sweeping_tasks_ ;
AllocationSpace space_to_start_ ;
AllocationSpace space_to_start_ ;
DISALLOW_COPY_AND_ASSIGN ( SweeperTask ) ;
DISALLOW_COPY_AND_ASSIGN ( SweeperTask ) ;
@ -618,15 +620,19 @@ void MarkCompactCollector::Sweeper::StartSweeping() {
}
}
void MarkCompactCollector : : Sweeper : : StartSweeperTasks ( ) {
void MarkCompactCollector : : Sweeper : : StartSweeperTasks ( ) {
DCHECK_EQ ( 0 , num_tasks_ ) ;
DCHECK_EQ ( 0 , num_sweeping_tasks_ . Value ( ) ) ;
if ( FLAG_concurrent_sweeping & & sweeping_in_progress_ ) {
if ( FLAG_concurrent_sweeping & & sweeping_in_progress_ ) {
ForAllSweepingSpaces ( [ this ] ( AllocationSpace space ) {
ForAllSweepingSpaces ( [ this ] ( AllocationSpace space ) {
if ( space = = NEW_SPACE ) return ;
if ( space = = NEW_SPACE ) return ;
num_sweeping_tasks_ . Increment ( 1 ) ;
num_sweeping_tasks_ . Increment ( 1 ) ;
semaphore_counter_ + + ;
SweeperTask * task = new SweeperTask ( heap_ - > isolate ( ) , this ,
& pending_sweeper_tasks_semaphore_ ,
& num_sweeping_tasks_ , space ) ;
DCHECK_LT ( num_tasks_ , kMaxSweeperTasks ) ;
task_ids_ [ num_tasks_ + + ] = task - > id ( ) ;
V8 : : GetCurrentPlatform ( ) - > CallOnBackgroundThread (
V8 : : GetCurrentPlatform ( ) - > CallOnBackgroundThread (
new SweeperTask ( this , & pending_sweeper_tasks_semaphore_ ,
task , v8 : : Platform : : kShortRunningTask ) ;
& num_sweeping_tasks_ , space ) ,
v8 : : Platform : : kShortRunningTask ) ;
} ) ;
} ) ;
}
}
}
}
@ -671,10 +677,14 @@ void MarkCompactCollector::Sweeper::EnsureCompleted() {
[ this ] ( AllocationSpace space ) { ParallelSweepSpace ( space , 0 ) ; } ) ;
[ this ] ( AllocationSpace space ) { ParallelSweepSpace ( space , 0 ) ; } ) ;
if ( FLAG_concurrent_sweeping ) {
if ( FLAG_concurrent_sweeping ) {
while ( semaphore_counter_ > 0 ) {
for ( int i = 0 ; i < num_tasks_ ; i + + ) {
pending_sweeper_tasks_semaphore_ . Wait ( ) ;
if ( heap_ - > isolate ( ) - > cancelable_task_manager ( ) - > TryAbort ( task_ids_ [ i ] ) ! =
semaphore_counter_ - - ;
CancelableTaskManager : : kTaskAborted ) {
pending_sweeper_tasks_semaphore_ . Wait ( ) ;
}
}
}
num_tasks_ = 0 ;
num_sweeping_tasks_ . SetValue ( 0 ) ;
}
}
ForAllSweepingSpaces ( [ this ] ( AllocationSpace space ) {
ForAllSweepingSpaces ( [ this ] ( AllocationSpace space ) {