@@ -300,7 +300,7 @@ MemoryAllocator::MemoryAllocator(Isolate* isolate)
300300 size_executable_(0 ),
301301 lowest_ever_allocated_(reinterpret_cast <void *>(-1 )),
302302 highest_ever_allocated_(reinterpret_cast <void *>(0 )),
303- unmapper_(this ) {}
303+ unmapper_(isolate-> heap (), this) {}
304304
305305bool MemoryAllocator::SetUp (size_t capacity, size_t code_range_size) {
306306 capacity_ = RoundUp (capacity, Page::kPageSize );
@@ -332,40 +332,46 @@ void MemoryAllocator::TearDown() {
332332 code_range_ = nullptr ;
333333}
334334
335- class MemoryAllocator ::Unmapper::UnmapFreeMemoryTask : public v8::Task {
335+ class MemoryAllocator ::Unmapper::UnmapFreeMemoryTask : public CancelableTask {
336336 public:
337- explicit UnmapFreeMemoryTask (Unmapper* unmapper) : unmapper_(unmapper) {}
337+ explicit UnmapFreeMemoryTask (Isolate* isolate, Unmapper* unmapper)
338+ : CancelableTask(isolate), unmapper_(unmapper) {}
338339
339340 private:
340- // v8::Task overrides.
341- void Run () override {
341+ void RunInternal () override {
342342 unmapper_->PerformFreeMemoryOnQueuedChunks <FreeMode::kUncommitPooled >();
343343 unmapper_->pending_unmapping_tasks_semaphore_ .Signal ();
344344 }
345345
346- Unmapper* unmapper_;
346+ Unmapper* const unmapper_;
347347 DISALLOW_COPY_AND_ASSIGN (UnmapFreeMemoryTask);
348348};
349349
350350void MemoryAllocator::Unmapper::FreeQueuedChunks () {
351351 ReconsiderDelayedChunks ();
352- if (FLAG_concurrent_sweeping) {
352+ if (heap_->use_tasks () && FLAG_concurrent_sweeping) {
353+ if (concurrent_unmapping_tasks_active_ >= kMaxUnmapperTasks ) {
354+ // kMaxUnmapperTasks are already running. Avoid creating any more.
355+ return ;
356+ }
357+ UnmapFreeMemoryTask* task = new UnmapFreeMemoryTask (heap_->isolate (), this );
358+ DCHECK_LT (concurrent_unmapping_tasks_active_, kMaxUnmapperTasks );
359+ task_ids_[concurrent_unmapping_tasks_active_++] = task->id ();
353360 V8::GetCurrentPlatform ()->CallOnBackgroundThread (
354- new UnmapFreeMemoryTask (this ), v8::Platform::kShortRunningTask );
355- concurrent_unmapping_tasks_active_++;
361+ task, v8::Platform::kShortRunningTask );
356362 } else {
357363 PerformFreeMemoryOnQueuedChunks<FreeMode::kUncommitPooled >();
358364 }
359365}
360366
361- bool MemoryAllocator::Unmapper::WaitUntilCompleted () {
362- bool waited = false ;
363- while (concurrent_unmapping_tasks_active_ > 0 ) {
364- pending_unmapping_tasks_semaphore_.Wait ();
365- concurrent_unmapping_tasks_active_--;
366- waited = true ;
367+ void MemoryAllocator::Unmapper::WaitUntilCompleted () {
368+ for (int i = 0 ; i < concurrent_unmapping_tasks_active_; i++) {
369+ if (heap_->isolate ()->cancelable_task_manager ()->TryAbort (task_ids_[i]) !=
370+ CancelableTaskManager::kTaskAborted ) {
371+ pending_unmapping_tasks_semaphore_.Wait ();
372+ }
373+ concurrent_unmapping_tasks_active_ = 0 ;
367374 }
368- return waited;
369375}
370376
371377template <MemoryAllocator::Unmapper::FreeMode mode>
@@ -392,7 +398,7 @@ void MemoryAllocator::Unmapper::PerformFreeMemoryOnQueuedChunks() {
392398}
393399
394400void MemoryAllocator::Unmapper::TearDown () {
395- WaitUntilCompleted ( );
401+ CHECK_EQ ( 0 , concurrent_unmapping_tasks_active_ );
396402 ReconsiderDelayedChunks ();
397403 CHECK (delayed_regular_chunks_.empty ());
398404 PerformFreeMemoryOnQueuedChunks<FreeMode::kReleasePooled >();
0 commit comments