aboutsummaryrefslogtreecommitdiff
path: root/src/libplatform/default-platform.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libplatform/default-platform.cc')
-rw-r--r--src/libplatform/default-platform.cc48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/libplatform/default-platform.cc b/src/libplatform/default-platform.cc
index 866a4471..0e2144b6 100644
--- a/src/libplatform/default-platform.cc
+++ b/src/libplatform/default-platform.cc
@@ -30,6 +30,12 @@ bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate) {
return reinterpret_cast<DefaultPlatform*>(platform)->PumpMessageLoop(isolate);
}
+void RunIdleTasks(v8::Platform* platform, v8::Isolate* isolate,
+ double idle_time_in_seconds) {
+ reinterpret_cast<DefaultPlatform*>(platform)->RunIdleTasks(
+ isolate, idle_time_in_seconds);
+}
+
void SetTracingController(
v8::Platform* platform,
v8::platform::tracing::TracingController* tracing_controller) {
@@ -69,6 +75,12 @@ DefaultPlatform::~DefaultPlatform() {
i->second.pop();
}
}
+ for (auto& i : main_thread_idle_queue_) {
+ while (!i.second.empty()) {
+ delete i.second.front();
+ i.second.pop();
+ }
+ }
}
@@ -118,6 +130,15 @@ Task* DefaultPlatform::PopTaskInMainThreadDelayedQueue(v8::Isolate* isolate) {
return deadline_and_task.second;
}
+IdleTask* DefaultPlatform::PopTaskInMainThreadIdleQueue(v8::Isolate* isolate) {
+ auto it = main_thread_idle_queue_.find(isolate);
+ if (it == main_thread_idle_queue_.end() || it->second.empty()) {
+ return nullptr;
+ }
+ IdleTask* task = it->second.front();
+ it->second.pop();
+ return task;
+}
bool DefaultPlatform::PumpMessageLoop(v8::Isolate* isolate) {
Task* task = NULL;
@@ -142,8 +163,25 @@ bool DefaultPlatform::PumpMessageLoop(v8::Isolate* isolate) {
return true;
}
+void DefaultPlatform::RunIdleTasks(v8::Isolate* isolate,
+ double idle_time_in_seconds) {
+ double deadline_in_seconds =
+ MonotonicallyIncreasingTime() + idle_time_in_seconds;
+ while (deadline_in_seconds > MonotonicallyIncreasingTime()) {
+ {
+ IdleTask* task;
+ {
+ base::LockGuard<base::Mutex> guard(&lock_);
+ task = PopTaskInMainThreadIdleQueue(isolate);
+ }
+ if (task == nullptr) return;
+ task->Run(deadline_in_seconds);
+ delete task;
+ }
+ }
+}
-void DefaultPlatform::CallOnBackgroundThread(Task *task,
+void DefaultPlatform::CallOnBackgroundThread(Task* task,
ExpectedRuntime expected_runtime) {
EnsureInitialized();
queue_.Append(task);
@@ -164,15 +202,13 @@ void DefaultPlatform::CallDelayedOnForegroundThread(Isolate* isolate,
main_thread_delayed_queue_[isolate].push(std::make_pair(deadline, task));
}
-
void DefaultPlatform::CallIdleOnForegroundThread(Isolate* isolate,
IdleTask* task) {
- UNREACHABLE();
+ base::LockGuard<base::Mutex> guard(&lock_);
+ main_thread_idle_queue_[isolate].push(task);
}
-
-bool DefaultPlatform::IdleTasksEnabled(Isolate* isolate) { return false; }
-
+bool DefaultPlatform::IdleTasksEnabled(Isolate* isolate) { return true; }
double DefaultPlatform::MonotonicallyIncreasingTime() {
return base::TimeTicks::HighResolutionNow().ToInternalValue() /