Index: src/compiler-dispatcher/compiler-dispatcher.h |
diff --git a/src/compiler-dispatcher/compiler-dispatcher.h b/src/compiler-dispatcher/compiler-dispatcher.h |
index fea141e22f970ff9112290707539ca5d4c574015..99c15db92504d8b97b573cd32283aefb051f557b 100644 |
--- a/src/compiler-dispatcher/compiler-dispatcher.h |
+++ b/src/compiler-dispatcher/compiler-dispatcher.h |
@@ -7,9 +7,12 @@ |
#include <map> |
#include <memory> |
+#include <unordered_set> |
#include <utility> |
#include "src/base/macros.h" |
+#include "src/base/platform/condition-variable.h" |
+#include "src/base/platform/mutex.h" |
#include "src/globals.h" |
#include "testing/gtest/include/gtest/gtest_prod.h" |
@@ -19,6 +22,7 @@ class Platform; |
namespace internal { |
+class CancelableTaskManager; |
class CompilerDispatcherJob; |
class CompilerDispatcherTracer; |
class Isolate; |
@@ -29,6 +33,30 @@ class Handle; |
// The CompilerDispatcher uses a combination of idle tasks and background tasks |
// to parse and compile lazily parsed functions. |
+// |
+// As both parsing and compilation currently requires a preparation and |
+// finalization step that happens on the main thread, every task has to be |
+// advanced during idle time first. Depending on the properties of the task, it |
+// can then be parsed or compiled on either background threads, or during idle |
+// time. Last, it has to be finalized during idle time again. |
+// |
+// CompilerDispatcher::jobs_ maintains the list of all CompilerDispatcherJobs |
+// the CompilerDispatcher knows about. |
+// |
+// CompilerDispatcher::pending_background_jobs_ contains the set of |
+// CompilerDispatcherJobs that can be processed on a background thread. |
+// |
+// CompilerDispatcher::running_background_jobs_ contains the set of |
+// CompilerDispatcherJobs that are currently being processed on a background |
+// thread. |
+// |
+// CompilerDispatcher::DoIdleWork tries to advance as many jobs out of jobs_ as |
+// possible during idle time. If a job can't be advanced, but is suitable for |
+// background processing, it fires off background threads. |
+// |
+// CompilerDispatcher::DoBackgroundWork advances one of the pending jobs, and |
+// then spins of another idle task to potentially do the final step on the main |
+// thread. |
class V8_EXPORT_PRIVATE CompilerDispatcher { |
public: |
enum class BlockingBehavior { kBlock, kDontBlock }; |
@@ -55,15 +83,23 @@ class V8_EXPORT_PRIVATE CompilerDispatcher { |
private: |
FRIEND_TEST(CompilerDispatcherTest, IdleTaskSmallIdleTime); |
+ FRIEND_TEST(IgnitionCompilerDispatcherTest, CompileOnBackgroundThread); |
+ FRIEND_TEST(IgnitionCompilerDispatcherTest, FinishNowWithBackgroundTask); |
typedef std::multimap<std::pair<int, int>, |
std::unique_ptr<CompilerDispatcherJob>> |
JobMap; |
+ class BackgroundTask; |
class IdleTask; |
+ void WaitForJobIfRunningOnBackground(CompilerDispatcherJob* job); |
bool IsEnabled() const; |
JobMap::const_iterator GetJobFor(Handle<SharedFunctionInfo> shared) const; |
+ void ConsiderJobForBackgroundProcessing(CompilerDispatcherJob* job); |
+ void ScheduleMoreBackgroundTasksIfNeeded(); |
+ void ScheduleIdleTaskFromAnyThread(); |
void ScheduleIdleTaskIfNeeded(); |
+ void DoBackgroundWork(); |
void DoIdleWork(double deadline_in_seconds); |
Isolate* isolate_; |
@@ -71,12 +107,33 @@ class V8_EXPORT_PRIVATE CompilerDispatcher { |
size_t max_stack_size_; |
std::unique_ptr<CompilerDispatcherTracer> tracer_; |
- bool idle_task_scheduled_; |
+ std::unique_ptr<CancelableTaskManager> task_manager_; |
// Mapping from (script id, function literal id) to job. We use a multimap, |
// as script id is not necessarily unique. |
JobMap jobs_; |
+ // The following members can be accessed from any thread. Methods need to hold |
+ // the mutex |mutex_| while accessing them. |
+ base::Mutex mutex_; |
+ |
+ bool idle_task_scheduled_; |
+ |
+ // Number of currently scheduled BackgroundTask objects. |
+ size_t num_scheduled_background_tasks_; |
+ |
+ // The set of CompilerDispatcherJobs that can be advanced on any thread. |
+ std::unordered_set<CompilerDispatcherJob*> pending_background_jobs_; |
+ |
+ // The set of CompilerDispatcherJobs currently processed on background |
+ // threads. |
+ std::unordered_set<CompilerDispatcherJob*> running_background_jobs_; |
+ |
+ // If not nullptr, then the main thread waits for the task processing |
+ // this job, and blocks on the ConditionVariable main_thread_blocking_signal_. |
+ CompilerDispatcherJob* main_thread_blocking_on_job_; |
+ base::ConditionVariable main_thread_blocking_signal_; |
+ |
DISALLOW_COPY_AND_ASSIGN(CompilerDispatcher); |
}; |