41 while (!should_yield) {
51 isolate->flush_denormals());
64 if (should_yield)
break;
95 : input_queue_(
v8_flags.concurrent_recompilation_queue_length),
96 recompilation_delay_(
v8_flags.concurrent_recompilation_delay) {}
114 if (
v8_flags.concurrent_recompilation ||
115 v8_flags.concurrent_builtin_generation) {
118 if (
v8_flags.concurrent_turbofan_max_threads == 0) {
121 max_tasks =
v8_flags.concurrent_turbofan_max_threads;
146 "V8.OptimizeBackground", job->
trace_id(),
154 RCS_SCOPE(&local_isolate, RuntimeCallCounterId::kOptimizeBackgroundTurbofan);
165 isolate->optimizing_compile_dispatcher()->QueueFinishedJob(job);
172 if (task_state.isolate == isolate) {
201 task_state.
job =
nullptr;
205 std::unique_ptr<TurbofanCompilationJob>& job) {
206 Isolate* isolate = job->isolate();
211 job_handle_->UpdatePriority(isolate->EfficiencyModeEnabledForTiering()
242 if (task_state.isolate == isolate && task_state.job) {
243 task_state.job->Cancel();
250 :
isolate_(isolate), task_executor_(task_executor) {}
302 if (
v8_flags.trace_concurrent_recompilation) {
303 PrintF(
" ** Flushed concurrent recompilation queues. (mode: %s)\n",
328 if (!info->is_osr() &&
329 function->HasAvailableCodeKind(
isolate_, info->code_kind())) {
330 if (
v8_flags.trace_concurrent_recompilation) {
331 PrintF(
" ** Aborting compilation for ");
333 PrintF(
" as it has already been optimized.\n");
340 if (function->native_context()->global_object()->IsDetached()) {
363 std::unique_ptr<TurbofanCompilationJob>& job) {
384 if (job->isolate() != isolate) return false;
385 return *job->compilation_info()->shared_info() == function;
389 auto first_for_isolate = std::find_if(
391 return job->isolate() == isolate;
394 std::iter_swap(it, first_for_isolate);
401 if (job->
isolate() != isolate)
return false;
412 return job->isolate() == isolate;
420 if (
queue_.empty())
return nullptr;
425 task_state.
job = job;
432 if (
queue_.empty())
return nullptr;
437 task_state.
job = job;
443 std::unique_ptr<TurbofanCompilationJob>& job) {
446 queue_.push_back(job.release());
458std::unique_ptr<TurbofanCompilationJob>
461 if (
queue_.empty())
return {};
462 std::unique_ptr<TurbofanCompilationJob> job(
queue_.front());
472 Isolate* isolate,
int installed_count) {
478 CHECK(isolate->IsGeneratingEmbeddedBuiltins());
485 return job1->FinalizeOrder() < job2->FinalizeOrder();
489 int current =
queue_.front()->FinalizeOrder();
491 std::unique_ptr<TurbofanCompilationJob> job(
queue_.front());
494 installed_count = current + 1;
496 return installed_count;
virtual bool ShouldYield()=0
virtual uint8_t GetTaskId()=0
V8_INLINE void AssertHeld() const
static void Sleep(TimeDelta interval)
static OwnedVector< T > New(size_t size)
static constexpr TimeDelta FromMilliseconds(int64_t milliseconds)
static void FinalizeTurbofanCompilationJob(TurbofanCompilationJob *job, Isolate *isolate)
static void DisposeTurbofanCompilationJob(Isolate *isolate, TurbofanCompilationJob *job)
LocalIsolate * main_thread_local_isolate()
ThreadId thread_id() const
StackGuard * stack_guard()
V8_INLINE void ExecuteMainThreadWhileParked(Callback callback)
RuntimeCallStats * runtime_call_stats() const
V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT Status ExecuteJob(RuntimeCallStats *stats, LocalIsolate *local_isolate=nullptr)
bool TryQueueForOptimization(std::unique_ptr< TurbofanCompilationJob > &job)
void Flush(BlockingBehavior blocking_behavior)
void QueueFinishedJob(TurbofanCompilationJob *job)
void FlushQueues(BlockingBehavior blocking_behavior)
int InstallGeneratedBuiltins(int installed_count)
OptimizingCompileInputQueue & input_queue()
void InstallOptimizedFunctions()
OptimizingCompileOutputQueue output_queue_
OptimizingCompileTaskExecutor * task_executor_
void Prioritize(Tagged< SharedFunctionInfo > function)
~OptimizingCompileDispatcher()
OptimizingCompileDispatcher(Isolate *isolate, OptimizingCompileTaskExecutor *task_executor)
void WaitUntilCompilationJobsDone()
int InstallGeneratedBuiltins(Isolate *isolate, int installed_count)
void Enqueue(TurbofanCompilationJob *job)
std::unique_ptr< TurbofanCompilationJob > Dequeue()
std::deque< TurbofanCompilationJob * > queue_
void Run(JobDelegate *delegate) override
size_t GetMaxConcurrency(size_t worker_count) const override
CompileTask(OptimizingCompileTaskExecutor *task_executor)
OptimizingCompileTaskExecutor * task_executor_
void WaitUntilCompilationJobsDoneForIsolate(Isolate *isolate)
bool TryQueueForOptimization(std::unique_ptr< TurbofanCompilationJob > &job)
~OptimizingCompileTaskExecutor()
void CancelCompilationJobsForIsolate(Isolate *isolate)
bool HasCompilationJobsForIsolate(Isolate *isolate)
static constexpr TaskPriority kTaskPriority
OptimizingCompileInputQueue input_queue_
void ClearTaskState(OptimizingCompileTaskState &task_state)
OptimizingCompileTaskExecutor()
TurbofanCompilationJob * NextInputIfIsolateMatches(OptimizingCompileTaskState &task_state)
void RunCompilationJob(OptimizingCompileTaskState &task_state, Isolate *isolate, LocalIsolate &local_isolate, TurbofanCompilationJob *job)
base::OwnedVector< OptimizingCompileTaskState > task_states_
TurbofanCompilationJob * NextInput(OptimizingCompileTaskState &task_state)
bool IsTaskRunningForIsolate(Isolate *isolate)
static constexpr TaskPriority kEfficiencyTaskPriority
std::unique_ptr< JobHandle > job_handle_
void ResetJob(OptimizingCompileTaskState &task_state)
static ThreadId Current()
uint64_t trace_id() const
Isolate * isolate() const
static V8_EXPORT_PRIVATE v8::Platform * GetCurrentPlatform()
void PrintF(const char *format,...)
void ShortPrint(Tagged< Object > obj, FILE *out)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
TurbofanCompilationJob * job
#define TRACE_EVENT0(category_group, name)
#define TRACE_DISABLED_BY_DEFAULT(name)
#define TRACE_EVENT_WITH_FLOW0(category_group, name, bind_id, flow_flags)
#define TRACE_EVENT_FLAG_FLOW_OUT
#define TRACE_EVENT_FLAG_FLOW_IN