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

Side by Side Diff: src/libplatform/default-platform.cc

Issue 2609833003: Add support for idle tasks to the default platform (Closed)
Patch Set: updates Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/libplatform/default-platform.h" 5 #include "src/libplatform/default-platform.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <queue> 8 #include <queue>
9 9
10 #include "include/libplatform/libplatform.h" 10 #include "include/libplatform/libplatform.h"
(...skipping 12 matching lines...) Expand all
23 platform->SetThreadPoolSize(thread_pool_size); 23 platform->SetThreadPoolSize(thread_pool_size);
24 platform->EnsureInitialized(); 24 platform->EnsureInitialized();
25 return platform; 25 return platform;
26 } 26 }
27 27
28 28
29 bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate) { 29 bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate) {
30 return reinterpret_cast<DefaultPlatform*>(platform)->PumpMessageLoop(isolate); 30 return reinterpret_cast<DefaultPlatform*>(platform)->PumpMessageLoop(isolate);
31 } 31 }
32 32
33 void RunIdleTasks(v8::Platform* platform, v8::Isolate* isolate,
34 double idle_time_in_seconds) {
35 reinterpret_cast<DefaultPlatform*>(platform)->RunIdleTasks(
36 isolate, idle_time_in_seconds);
37 }
38
33 void SetTracingController( 39 void SetTracingController(
34 v8::Platform* platform, 40 v8::Platform* platform,
35 v8::platform::tracing::TracingController* tracing_controller) { 41 v8::platform::tracing::TracingController* tracing_controller) {
36 return reinterpret_cast<DefaultPlatform*>(platform)->SetTracingController( 42 return reinterpret_cast<DefaultPlatform*>(platform)->SetTracingController(
37 tracing_controller); 43 tracing_controller);
38 } 44 }
39 45
40 const int DefaultPlatform::kMaxThreadPoolSize = 8; 46 const int DefaultPlatform::kMaxThreadPoolSize = 8;
41 47
42 DefaultPlatform::DefaultPlatform() 48 DefaultPlatform::DefaultPlatform()
(...skipping 19 matching lines...) Expand all
62 i->second.pop(); 68 i->second.pop();
63 } 69 }
64 } 70 }
65 for (auto i = main_thread_delayed_queue_.begin(); 71 for (auto i = main_thread_delayed_queue_.begin();
66 i != main_thread_delayed_queue_.end(); ++i) { 72 i != main_thread_delayed_queue_.end(); ++i) {
67 while (!i->second.empty()) { 73 while (!i->second.empty()) {
68 delete i->second.top().second; 74 delete i->second.top().second;
69 i->second.pop(); 75 i->second.pop();
70 } 76 }
71 } 77 }
78 for (auto& i : main_thread_idle_queue_) {
79 while (!i.second.empty()) {
80 delete i.second.front();
81 i.second.pop();
82 }
83 }
72 } 84 }
73 85
74 86
75 void DefaultPlatform::SetThreadPoolSize(int thread_pool_size) { 87 void DefaultPlatform::SetThreadPoolSize(int thread_pool_size) {
76 base::LockGuard<base::Mutex> guard(&lock_); 88 base::LockGuard<base::Mutex> guard(&lock_);
77 DCHECK(thread_pool_size >= 0); 89 DCHECK(thread_pool_size >= 0);
78 if (thread_pool_size < 1) { 90 if (thread_pool_size < 1) {
79 thread_pool_size = base::SysInfo::NumberOfProcessors() - 1; 91 thread_pool_size = base::SysInfo::NumberOfProcessors() - 1;
80 } 92 }
81 thread_pool_size_ = 93 thread_pool_size_ =
(...skipping 29 matching lines...) Expand all
111 } 123 }
112 double now = MonotonicallyIncreasingTime(); 124 double now = MonotonicallyIncreasingTime();
113 std::pair<double, Task*> deadline_and_task = it->second.top(); 125 std::pair<double, Task*> deadline_and_task = it->second.top();
114 if (deadline_and_task.first > now) { 126 if (deadline_and_task.first > now) {
115 return NULL; 127 return NULL;
116 } 128 }
117 it->second.pop(); 129 it->second.pop();
118 return deadline_and_task.second; 130 return deadline_and_task.second;
119 } 131 }
120 132
133 IdleTask* DefaultPlatform::PopTaskInMainThreadIdleQueue(v8::Isolate* isolate) {
134 auto it = main_thread_idle_queue_.find(isolate);
135 if (it == main_thread_idle_queue_.end() || it->second.empty()) {
136 return nullptr;
137 }
138 IdleTask* task = it->second.front();
139 it->second.pop();
140 return task;
141 }
121 142
122 bool DefaultPlatform::PumpMessageLoop(v8::Isolate* isolate) { 143 bool DefaultPlatform::PumpMessageLoop(v8::Isolate* isolate) {
123 Task* task = NULL; 144 Task* task = NULL;
124 { 145 {
125 base::LockGuard<base::Mutex> guard(&lock_); 146 base::LockGuard<base::Mutex> guard(&lock_);
126 147
127 // Move delayed tasks that hit their deadline to the main queue. 148 // Move delayed tasks that hit their deadline to the main queue.
128 task = PopTaskInMainThreadDelayedQueue(isolate); 149 task = PopTaskInMainThreadDelayedQueue(isolate);
129 while (task != NULL) { 150 while (task != NULL) {
130 main_thread_queue_[isolate].push(task); 151 main_thread_queue_[isolate].push(task);
131 task = PopTaskInMainThreadDelayedQueue(isolate); 152 task = PopTaskInMainThreadDelayedQueue(isolate);
132 } 153 }
133 154
134 task = PopTaskInMainThreadQueue(isolate); 155 task = PopTaskInMainThreadQueue(isolate);
135 156
136 if (task == NULL) { 157 if (task == NULL) {
137 return false; 158 return false;
138 } 159 }
139 } 160 }
140 task->Run(); 161 task->Run();
141 delete task; 162 delete task;
142 return true; 163 return true;
143 } 164 }
144 165
166 void DefaultPlatform::RunIdleTasks(v8::Isolate* isolate,
167 double idle_time_in_seconds) {
168 double deadline_in_seconds =
169 MonotonicallyIncreasingTime() + idle_time_in_seconds;
170 while (deadline_in_seconds > MonotonicallyIncreasingTime()) {
171 {
172 IdleTask* task;
173 {
174 base::LockGuard<base::Mutex> guard(&lock_);
175 task = PopTaskInMainThreadIdleQueue(isolate);
176 }
177 if (task == nullptr) return;
178 task->Run(deadline_in_seconds);
179 delete task;
180 }
181 }
182 }
145 183
146 void DefaultPlatform::CallOnBackgroundThread(Task *task, 184 void DefaultPlatform::CallOnBackgroundThread(Task* task,
147 ExpectedRuntime expected_runtime) { 185 ExpectedRuntime expected_runtime) {
148 EnsureInitialized(); 186 EnsureInitialized();
149 queue_.Append(task); 187 queue_.Append(task);
150 } 188 }
151 189
152 190
153 void DefaultPlatform::CallOnForegroundThread(v8::Isolate* isolate, Task* task) { 191 void DefaultPlatform::CallOnForegroundThread(v8::Isolate* isolate, Task* task) {
154 base::LockGuard<base::Mutex> guard(&lock_); 192 base::LockGuard<base::Mutex> guard(&lock_);
155 main_thread_queue_[isolate].push(task); 193 main_thread_queue_[isolate].push(task);
156 } 194 }
157 195
158 196
159 void DefaultPlatform::CallDelayedOnForegroundThread(Isolate* isolate, 197 void DefaultPlatform::CallDelayedOnForegroundThread(Isolate* isolate,
160 Task* task, 198 Task* task,
161 double delay_in_seconds) { 199 double delay_in_seconds) {
162 base::LockGuard<base::Mutex> guard(&lock_); 200 base::LockGuard<base::Mutex> guard(&lock_);
163 double deadline = MonotonicallyIncreasingTime() + delay_in_seconds; 201 double deadline = MonotonicallyIncreasingTime() + delay_in_seconds;
164 main_thread_delayed_queue_[isolate].push(std::make_pair(deadline, task)); 202 main_thread_delayed_queue_[isolate].push(std::make_pair(deadline, task));
165 } 203 }
166 204
167
168 void DefaultPlatform::CallIdleOnForegroundThread(Isolate* isolate, 205 void DefaultPlatform::CallIdleOnForegroundThread(Isolate* isolate,
169 IdleTask* task) { 206 IdleTask* task) {
170 UNREACHABLE(); 207 base::LockGuard<base::Mutex> guard(&lock_);
208 main_thread_idle_queue_[isolate].push(task);
171 } 209 }
172 210
173 211 bool DefaultPlatform::IdleTasksEnabled(Isolate* isolate) { return true; }
174 bool DefaultPlatform::IdleTasksEnabled(Isolate* isolate) { return false; }
175
176 212
177 double DefaultPlatform::MonotonicallyIncreasingTime() { 213 double DefaultPlatform::MonotonicallyIncreasingTime() {
178 return base::TimeTicks::HighResolutionNow().ToInternalValue() / 214 return base::TimeTicks::HighResolutionNow().ToInternalValue() /
179 static_cast<double>(base::Time::kMicrosecondsPerSecond); 215 static_cast<double>(base::Time::kMicrosecondsPerSecond);
180 } 216 }
181 217
182 uint64_t DefaultPlatform::AddTraceEvent( 218 uint64_t DefaultPlatform::AddTraceEvent(
183 char phase, const uint8_t* category_enabled_flag, const char* name, 219 char phase, const uint8_t* category_enabled_flag, const char* name,
184 const char* scope, uint64_t id, uint64_t bind_id, int num_args, 220 const char* scope, uint64_t id, uint64_t bind_id, int num_args,
185 const char** arg_names, const uint8_t* arg_types, 221 const char** arg_names, const uint8_t* arg_types,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 tracing_controller_->AddTraceStateObserver(observer); 268 tracing_controller_->AddTraceStateObserver(observer);
233 } 269 }
234 270
235 void DefaultPlatform::RemoveTraceStateObserver(TraceStateObserver* observer) { 271 void DefaultPlatform::RemoveTraceStateObserver(TraceStateObserver* observer) {
236 if (!tracing_controller_) return; 272 if (!tracing_controller_) return;
237 tracing_controller_->RemoveTraceStateObserver(observer); 273 tracing_controller_->RemoveTraceStateObserver(observer);
238 } 274 }
239 275
240 } // namespace platform 276 } // namespace platform
241 } // namespace v8 277 } // namespace v8
OLDNEW
« no previous file with comments | « src/libplatform/default-platform.h ('k') | test/unittests/libplatform/default-platform-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698