Index: src/compiler-dispatcher/compiler-dispatcher.cc |
diff --git a/src/compiler-dispatcher/compiler-dispatcher.cc b/src/compiler-dispatcher/compiler-dispatcher.cc |
index ba5154e0112591bae737245c87cf08e756c65a39..782a6ed855ea78a03f7e9829ef6f33b966e515fa 100644 |
--- a/src/compiler-dispatcher/compiler-dispatcher.cc |
+++ b/src/compiler-dispatcher/compiler-dispatcher.cc |
@@ -52,11 +52,13 @@ |
break; |
} |
- DCHECK_EQ(job->status() == CompileJobStatus::kFailed, |
- isolate->has_pending_exception()); |
- if (job->status() == CompileJobStatus::kFailed && |
- exception_handling == ExceptionHandling::kSwallow) { |
- isolate->clear_pending_exception(); |
+ if (job->status() == CompileJobStatus::kFailed) { |
+ DCHECK(isolate->has_pending_exception()); |
+ if (exception_handling == ExceptionHandling::kSwallow) { |
+ isolate->clear_pending_exception(); |
+ } |
+ } else { |
+ DCHECK(!isolate->has_pending_exception()); |
} |
return job->status() != CompileJobStatus::kFailed; |
} |
@@ -94,32 +96,6 @@ |
const double kMaxIdleTimeToExpectInMs = 40; |
} // namespace |
- |
-class CompilerDispatcher::AbortTask : public CancelableTask { |
- public: |
- AbortTask(Isolate* isolate, CancelableTaskManager* task_manager, |
- CompilerDispatcher* dispatcher); |
- ~AbortTask() override; |
- |
- // CancelableTask implementation. |
- void RunInternal() override; |
- |
- private: |
- CompilerDispatcher* dispatcher_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AbortTask); |
-}; |
- |
-CompilerDispatcher::AbortTask::AbortTask(Isolate* isolate, |
- CancelableTaskManager* task_manager, |
- CompilerDispatcher* dispatcher) |
- : CancelableTask(isolate, task_manager), dispatcher_(dispatcher) {} |
- |
-CompilerDispatcher::AbortTask::~AbortTask() {} |
- |
-void CompilerDispatcher::AbortTask::RunInternal() { |
- dispatcher_->AbortInactiveJobs(); |
-} |
class CompilerDispatcher::BackgroundTask : public CancelableTask { |
public: |
@@ -180,12 +156,9 @@ |
max_stack_size_(max_stack_size), |
tracer_(new CompilerDispatcherTracer(isolate_)), |
task_manager_(new CancelableTaskManager()), |
- abort_(false), |
idle_task_scheduled_(false), |
num_scheduled_background_tasks_(0), |
- main_thread_blocking_on_job_(nullptr), |
- block_for_testing_(false), |
- semaphore_for_testing_(0) {} |
+ main_thread_blocking_on_job_(nullptr) {} |
CompilerDispatcher::~CompilerDispatcher() { |
// To avoid crashing in unit tests due to unfished jobs. |
@@ -195,11 +168,6 @@ |
bool CompilerDispatcher::Enqueue(Handle<SharedFunctionInfo> function) { |
if (!IsEnabled()) return false; |
- |
- { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- if (abort_) return false; |
- } |
// We only handle functions (no eval / top-level code / wasm) that are |
// attached to a script. |
@@ -255,68 +223,17 @@ |
bool result = job->second->status() != CompileJobStatus::kFailed; |
job->second->ResetOnMainThread(); |
jobs_.erase(job); |
- if (jobs_.empty()) { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- abort_ = false; |
- } |
return result; |
} |
void CompilerDispatcher::AbortAll(BlockingBehavior blocking) { |
- bool background_tasks_running = |
- task_manager_->TryAbortAll() == CancelableTaskManager::kTaskRunning; |
- if (!background_tasks_running || blocking == BlockingBehavior::kBlock) { |
- for (auto& it : jobs_) { |
- WaitForJobIfRunningOnBackground(it.second.get()); |
- it.second->ResetOnMainThread(); |
- } |
- jobs_.clear(); |
- { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- DCHECK(pending_background_jobs_.empty()); |
- DCHECK(running_background_jobs_.empty()); |
- abort_ = false; |
- } |
- return; |
- } |
- |
- { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- abort_ = true; |
- pending_background_jobs_.clear(); |
- } |
- AbortInactiveJobs(); |
- |
- // All running background jobs might already have scheduled idle tasks instead |
- // of abort tasks. Schedule a single abort task here to make sure they get |
- // processed as soon as possible (and not first when we have idle time). |
- ScheduleAbortTask(); |
-} |
- |
-void CompilerDispatcher::AbortInactiveJobs() { |
- { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- // Since we schedule two abort tasks per async abort, we might end up |
- // here with nothing left to do. |
- if (!abort_) return; |
- } |
- for (auto it = jobs_.begin(); it != jobs_.end();) { |
- auto job = it; |
- ++it; |
- { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- if (running_background_jobs_.find(job->second.get()) != |
- running_background_jobs_.end()) { |
- continue; |
- } |
- } |
- job->second->ResetOnMainThread(); |
- jobs_.erase(job); |
- } |
- if (jobs_.empty()) { |
- base::LockGuard<base::Mutex> lock(&mutex_); |
- abort_ = false; |
- } |
+ // TODO(jochen): Implement support for non-blocking abort. |
+ DCHECK(blocking == BlockingBehavior::kBlock); |
+ for (auto& kv : jobs_) { |
+ WaitForJobIfRunningOnBackground(kv.second.get()); |
+ kv.second->ResetOnMainThread(); |
+ } |
+ jobs_.clear(); |
} |
CompilerDispatcher::JobMap::const_iterator CompilerDispatcher::GetJobFor( |
@@ -348,12 +265,6 @@ |
ScheduleIdleTaskFromAnyThread(); |
} |
-void CompilerDispatcher::ScheduleAbortTask() { |
- v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_); |
- platform_->CallOnForegroundThread( |
- v8_isolate, new AbortTask(isolate_, task_manager_.get(), this)); |
-} |
- |
void CompilerDispatcher::ConsiderJobForBackgroundProcessing( |
CompilerDispatcherJob* job) { |
if (!CanRunOnAnyThread(job)) return; |
@@ -393,12 +304,6 @@ |
} |
} |
if (job == nullptr) return; |
- |
- if (V8_UNLIKELY(block_for_testing_.Value())) { |
- block_for_testing_.SetValue(false); |
- semaphore_for_testing_.Wait(); |
- } |
- |
DoNextStepOnBackgroundThread(job); |
ScheduleMoreBackgroundTasksIfNeeded(); |
@@ -410,13 +315,6 @@ |
base::LockGuard<base::Mutex> lock(&mutex_); |
running_background_jobs_.erase(job); |
- if (running_background_jobs_.empty() && abort_) { |
- // This is the last background job that finished. The abort task |
- // scheduled by AbortAll might already have ran, so schedule another |
- // one to be on the safe side. |
- ScheduleAbortTask(); |
- } |
- |
if (main_thread_blocking_on_job_ == job) { |
main_thread_blocking_on_job_ = nullptr; |
main_thread_blocking_signal_.NotifyOne(); |
@@ -427,16 +325,9 @@ |
} |
void CompilerDispatcher::DoIdleWork(double deadline_in_seconds) { |
- bool aborted = false; |
{ |
base::LockGuard<base::Mutex> lock(&mutex_); |
idle_task_scheduled_ = false; |
- aborted = abort_; |
- } |
- |
- if (aborted) { |
- AbortInactiveJobs(); |
- return; |
} |
// Number of jobs that are unlikely to make progress during any idle callback |