@@ -302,7 +302,7 @@ MemoryAllocator::MemoryAllocator(Isolate* isolate)
302302 size_executable_(0 ),
303303 lowest_ever_allocated_(reinterpret_cast <void *>(-1 )),
304304 highest_ever_allocated_(reinterpret_cast <void *>(0 )),
305- unmapper_(this ) {}
305+ unmapper_(isolate-> heap (), this) {}
306306
307307bool MemoryAllocator::SetUp (size_t capacity, size_t code_range_size) {
308308 capacity_ = RoundUp (capacity, Page::kPageSize );
@@ -334,40 +334,46 @@ void MemoryAllocator::TearDown() {
334334 code_range_ = nullptr ;
335335}
336336
337- class MemoryAllocator ::Unmapper::UnmapFreeMemoryTask : public v8::Task {
337+ class MemoryAllocator ::Unmapper::UnmapFreeMemoryTask : public CancelableTask {
338338 public:
339- explicit UnmapFreeMemoryTask (Unmapper* unmapper) : unmapper_(unmapper) {}
339+ explicit UnmapFreeMemoryTask (Isolate* isolate, Unmapper* unmapper)
340+ : CancelableTask(isolate), unmapper_(unmapper) {}
340341
341342 private:
342- // v8::Task overrides.
343- void Run () override {
343+ void RunInternal () override {
344344 unmapper_->PerformFreeMemoryOnQueuedChunks <FreeMode::kUncommitPooled >();
345345 unmapper_->pending_unmapping_tasks_semaphore_ .Signal ();
346346 }
347347
348- Unmapper* unmapper_;
348+ Unmapper* const unmapper_;
349349 DISALLOW_COPY_AND_ASSIGN (UnmapFreeMemoryTask);
350350};
351351
352352void MemoryAllocator::Unmapper::FreeQueuedChunks () {
353353 ReconsiderDelayedChunks ();
354- if (FLAG_concurrent_sweeping) {
354+ if (heap_->use_tasks () && FLAG_concurrent_sweeping) {
355+ if (concurrent_unmapping_tasks_active_ >= kMaxUnmapperTasks ) {
356+ // kMaxUnmapperTasks are already running. Avoid creating any more.
357+ return ;
358+ }
359+ UnmapFreeMemoryTask* task = new UnmapFreeMemoryTask (heap_->isolate (), this );
360+ DCHECK_LT (concurrent_unmapping_tasks_active_, kMaxUnmapperTasks );
361+ task_ids_[concurrent_unmapping_tasks_active_++] = task->id ();
355362 V8::GetCurrentPlatform ()->CallOnBackgroundThread (
356- new UnmapFreeMemoryTask (this ), v8::Platform::kShortRunningTask );
357- concurrent_unmapping_tasks_active_++;
363+ task, v8::Platform::kShortRunningTask );
358364 } else {
359365 PerformFreeMemoryOnQueuedChunks<FreeMode::kUncommitPooled >();
360366 }
361367}
362368
363- bool MemoryAllocator::Unmapper::WaitUntilCompleted () {
364- bool waited = false ;
365- while (concurrent_unmapping_tasks_active_ > 0 ) {
366- pending_unmapping_tasks_semaphore_.Wait ();
367- concurrent_unmapping_tasks_active_--;
368- waited = true ;
369+ void MemoryAllocator::Unmapper::WaitUntilCompleted () {
370+ for (int i = 0 ; i < concurrent_unmapping_tasks_active_; i++) {
371+ if (heap_->isolate ()->cancelable_task_manager ()->TryAbort (task_ids_[i]) !=
372+ CancelableTaskManager::kTaskAborted ) {
373+ pending_unmapping_tasks_semaphore_.Wait ();
374+ }
375+ concurrent_unmapping_tasks_active_ = 0 ;
369376 }
370- return waited;
371377}
372378
373379template <MemoryAllocator::Unmapper::FreeMode mode>
@@ -394,7 +400,7 @@ void MemoryAllocator::Unmapper::PerformFreeMemoryOnQueuedChunks() {
394400}
395401
396402void MemoryAllocator::Unmapper::TearDown () {
397- WaitUntilCompleted ( );
403+ CHECK_EQ ( 0 , concurrent_unmapping_tasks_active_ );
398404 ReconsiderDelayedChunks ();
399405 CHECK (delayed_regular_chunks_.empty ());
400406 PerformFreeMemoryOnQueuedChunks<FreeMode::kReleasePooled >();
0 commit comments