blob: e14e8aafbcaeb3bce9a796a9ff196f21e0713d78 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_OPTIMIZING_COMPILE_DISPATCHER_H_
6#define V8_OPTIMIZING_COMPILE_DISPATCHER_H_
7
8#include <queue>
9
10#include "src/base/atomicops.h"
11#include "src/base/platform/condition-variable.h"
12#include "src/base/platform/mutex.h"
13#include "src/base/platform/platform.h"
14#include "src/flags.h"
15#include "src/list.h"
16
17namespace v8 {
18namespace internal {
19
20class HOptimizedGraphBuilder;
21class OptimizedCompileJob;
22class SharedFunctionInfo;
23
24class OptimizingCompileDispatcher {
25 public:
26 explicit OptimizingCompileDispatcher(Isolate* isolate)
27 : isolate_(isolate),
28 input_queue_capacity_(FLAG_concurrent_recompilation_queue_length),
29 input_queue_length_(0),
30 input_queue_shift_(0),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000031 blocked_jobs_(0),
32 ref_count_(0),
33 recompilation_delay_(FLAG_concurrent_recompilation_delay) {
34 base::NoBarrier_Store(&mode_, static_cast<base::AtomicWord>(COMPILE));
35 input_queue_ = NewArray<OptimizedCompileJob*>(input_queue_capacity_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 }
37
38 ~OptimizingCompileDispatcher();
39
40 void Run();
41 void Stop();
42 void Flush();
43 void QueueForOptimization(OptimizedCompileJob* optimizing_compiler);
44 void Unblock();
45 void InstallOptimizedFunctions();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046
47 inline bool IsQueueAvailable() {
48 base::LockGuard<base::Mutex> access_input_queue(&input_queue_mutex_);
49 return input_queue_length_ < input_queue_capacity_;
50 }
51
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052 static bool Enabled() { return FLAG_concurrent_recompilation; }
53
54 private:
55 class CompileTask;
56
57 enum ModeFlag { COMPILE, FLUSH };
58
59 void FlushOutputQueue(bool restore_function_code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000060 void CompileNext(OptimizedCompileJob* job);
61 OptimizedCompileJob* NextInput(bool check_if_flushing = false);
62
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000063 inline int InputQueueIndex(int i) {
64 int result = (i + input_queue_shift_) % input_queue_capacity_;
65 DCHECK_LE(0, result);
66 DCHECK_LT(result, input_queue_capacity_);
67 return result;
68 }
69
70 Isolate* isolate_;
71
72 // Circular queue of incoming recompilation tasks (including OSR).
73 OptimizedCompileJob** input_queue_;
74 int input_queue_capacity_;
75 int input_queue_length_;
76 int input_queue_shift_;
77 base::Mutex input_queue_mutex_;
78
79 // Queue of recompilation tasks ready to be installed (excluding OSR).
80 std::queue<OptimizedCompileJob*> output_queue_;
81 // Used for job based recompilation which has multiple producers on
82 // different threads.
83 base::Mutex output_queue_mutex_;
84
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000085 volatile base::AtomicWord mode_;
86
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087 int blocked_jobs_;
88
89 int ref_count_;
90 base::Mutex ref_count_mutex_;
91 base::ConditionVariable ref_count_zero_;
92
93 // Copy of FLAG_concurrent_recompilation_delay that will be used from the
94 // background thread.
95 //
96 // Since flags might get modified while the background thread is running, it
97 // is not safe to access them directly.
98 int recompilation_delay_;
99};
100} // namespace internal
101} // namespace v8
102
103#endif // V8_OPTIMIZING_COMPILE_DISPATCHER_H_