Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2224)

Unified Diff: src/compiler-dispatcher/compiler-dispatcher.h

Issue 2606263002: Use background tasks for the compiler dispatcher (Closed)
Patch Set: updates Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..32b36e35e37266c08a9199ce4f365e1e997e955d 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;
@@ -55,15 +59,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 +83,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);
};

Powered by Google App Engine
This is Rietveld 408576698