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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc

Issue 2273703002: Force events to be non blocking if main thread is unresponsive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address feedback. Created 4 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium 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 "platform/scheduler/base/task_queue_manager.h" 5 #include "platform/scheduler/base/task_queue_manager.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 240
241 for (int i = 0; i < work_batch_size_; i++) { 241 for (int i = 0; i < work_batch_size_; i++) {
242 internal::WorkQueue* work_queue; 242 internal::WorkQueue* work_queue;
243 if (!SelectWorkQueueToService(&work_queue)) 243 if (!SelectWorkQueueToService(&work_queue))
244 break; 244 break;
245 245
246 // TaskQueueManager guarantees that task queue will not be deleted 246 // TaskQueueManager guarantees that task queue will not be deleted
247 // when we are in DoWork (but WorkQueue may be deleted). 247 // when we are in DoWork (but WorkQueue may be deleted).
248 internal::TaskQueueImpl* task_queue = work_queue->task_queue(); 248 internal::TaskQueueImpl* task_queue = work_queue->task_queue();
249 249
250 if (!delegate_->IsNested()) {
251 for (auto& observer : task_time_observers_)
252 observer.ReportTaskStartTime(MonotonicTimeInSeconds(task_start_time));
253 }
254
250 switch (ProcessTaskFromWorkQueue(work_queue)) { 255 switch (ProcessTaskFromWorkQueue(work_queue)) {
251 case ProcessTaskResult::DEFERRED: 256 case ProcessTaskResult::DEFERRED:
257 if (delegate_->IsNested())
258 continue;
259 // TODO - test this case.
252 // If a task was deferred, try again with another task. 260 // If a task was deferred, try again with another task.
261 for (auto& observer : task_time_observers_) {
262 observer.ReportTaskEndTime(task_queue,
263 MonotonicTimeInSeconds(task_start_time),
264 MonotonicTimeInSeconds(task_start_time));
265 }
253 continue; 266 continue;
254 case ProcessTaskResult::EXECUTED: 267 case ProcessTaskResult::EXECUTED:
255 break; 268 break;
256 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: 269 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED:
257 return; // The TaskQueueManager got deleted, we must bail out. 270 return; // The TaskQueueManager got deleted, we must bail out.
258 } 271 }
259 272
260 lazy_now = real_time_domain()->CreateLazyNow(); 273 lazy_now = real_time_domain()->CreateLazyNow();
261 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { 274 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) {
262 // Only report top level task durations. 275 // Only report top level task durations.
263 base::TimeTicks task_end_time = lazy_now.Now(); 276 base::TimeTicks task_end_time = lazy_now.Now();
264 for (auto& observer : task_time_observers_) { 277 for (auto& observer : task_time_observers_) {
265 observer.ReportTaskTime(task_queue, 278 observer.ReportTaskEndTime(task_queue,
266 MonotonicTimeInSeconds(task_start_time), 279 MonotonicTimeInSeconds(task_start_time),
267 MonotonicTimeInSeconds(task_end_time)); 280 MonotonicTimeInSeconds(task_end_time));
268 } 281 }
269 task_start_time = task_end_time; 282 task_start_time = task_end_time;
270 } 283 }
271 284
272 work_queue = nullptr; // The queue may have been unregistered. 285 work_queue = nullptr; // The queue may have been unregistered.
273 286
274 UpdateWorkQueues(lazy_now); 287 UpdateWorkQueues(lazy_now);
275 288
276 // Only run a single task per batch in nested run loops so that we can 289 // Only run a single task per batch in nested run loops so that we can
277 // properly exit the nested loop when someone calls RunLoop::Quit(). 290 // properly exit the nested loop when someone calls RunLoop::Quit().
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 *work_queue->GetFrontTask()); 503 *work_queue->GetFrontTask());
491 } 504 }
492 } 505 }
493 506
494 bool TaskQueueManager::HasImmediateWorkForTesting() const { 507 bool TaskQueueManager::HasImmediateWorkForTesting() const {
495 return !selector_.EnabledWorkQueuesEmpty(); 508 return !selector_.EnabledWorkQueuesEmpty();
496 } 509 }
497 510
498 } // namespace scheduler 511 } // namespace scheduler
499 } // namespace blink 512 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698