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

Side by Side Diff: base/message_loop/message_loop.cc

Issue 1898233002: Report expected task queueing time via UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Super rough alternative approach. Created 4 years, 6 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 Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "base/message_loop/message_loop.h" 5 #include "base/message_loop/message_loop.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 } 116 }
117 117
118 MessageLoop::TaskObserver::~TaskObserver() { 118 MessageLoop::TaskObserver::~TaskObserver() {
119 } 119 }
120 120
121 MessageLoop::DestructionObserver::~DestructionObserver() { 121 MessageLoop::DestructionObserver::~DestructionObserver() {
122 } 122 }
123 123
124 MessageLoop::NestingObserver::~NestingObserver() {} 124 MessageLoop::NestingObserver::~NestingObserver() {}
125 125
126 MessageLoop::RecentTimeObserver::~RecentTimeObserver() {}
127
126 //------------------------------------------------------------------------------ 128 //------------------------------------------------------------------------------
127 129
128 MessageLoop::MessageLoop(Type type) 130 MessageLoop::MessageLoop(Type type)
129 : MessageLoop(type, MessagePumpFactoryCallback()) { 131 : MessageLoop(type, MessagePumpFactoryCallback()) {
130 BindToCurrentThread(); 132 BindToCurrentThread();
131 } 133 }
132 134
133 MessageLoop::MessageLoop(std::unique_ptr<MessagePump> pump) 135 MessageLoop::MessageLoop(std::unique_ptr<MessagePump> pump)
134 : MessageLoop(TYPE_CUSTOM, Bind(&ReturnPump, Passed(&pump))) { 136 : MessageLoop(TYPE_CUSTOM, Bind(&ReturnPump, Passed(&pump))) {
135 BindToCurrentThread(); 137 BindToCurrentThread();
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 void MessageLoop::AddNestingObserver(NestingObserver* observer) { 270 void MessageLoop::AddNestingObserver(NestingObserver* observer) {
269 DCHECK_EQ(this, current()); 271 DCHECK_EQ(this, current());
270 nesting_observers_.AddObserver(observer); 272 nesting_observers_.AddObserver(observer);
271 } 273 }
272 274
273 void MessageLoop::RemoveNestingObserver(NestingObserver* observer) { 275 void MessageLoop::RemoveNestingObserver(NestingObserver* observer) {
274 DCHECK_EQ(this, current()); 276 DCHECK_EQ(this, current());
275 nesting_observers_.RemoveObserver(observer); 277 nesting_observers_.RemoveObserver(observer);
276 } 278 }
277 279
280 void MessageLoop::AddRecentTimeObserver(RecentTimeObserver* observer) {
281 DCHECK_EQ(this, current());
282 recent_time_observers_.AddObserver(observer);
283 }
284
285 void MessageLoop::RemoveRecentTimeObserver(RecentTimeObserver* observer) {
286 DCHECK_EQ(this, current());
287 recent_time_observers_.RemoveObserver(observer);
288 }
289
278 void MessageLoop::PostTask( 290 void MessageLoop::PostTask(
279 const tracked_objects::Location& from_here, 291 const tracked_objects::Location& from_here,
280 const Closure& task) { 292 const Closure& task) {
281 task_runner_->PostTask(from_here, task); 293 task_runner_->PostTask(from_here, task);
282 } 294 }
283 295
284 void MessageLoop::PostDelayedTask( 296 void MessageLoop::PostDelayedTask(
285 const tracked_objects::Location& from_here, 297 const tracked_objects::Location& from_here,
286 const Closure& task, 298 const Closure& task,
287 TimeDelta delay) { 299 TimeDelta delay) {
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 return true; 614 return true;
603 } 615 }
604 } while (!work_queue_.empty()); 616 } while (!work_queue_.empty());
605 } 617 }
606 618
607 // Nothing happened. 619 // Nothing happened.
608 return false; 620 return false;
609 } 621 }
610 622
611 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) { 623 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
624 recent_time_ = TimeTicks::Now();
tdresser 2016/05/30 19:07:46 This is probably the scariest part of this patch.
panicker 2016/06/07 19:58:02 Looks like this is undoing the optimization added
tdresser 2016/06/07 20:23:16 I'm not very worried about calling now even when t
625
626 FOR_EACH_OBSERVER(RecentTimeObserver, recent_time_observers_,
627 OnUpdateRecentTime(recent_time_));
panicker 2016/06/07 19:58:02 To me it seems iffy to call an override-able metho
tdresser 2016/06/07 20:23:15 It isn't completely clear to me how you'd make thi
panicker 2016/06/07 21:04:39 Yeah a global-ish getter could work, although not
628
612 if (!nestable_tasks_allowed_ || delayed_work_queue_.empty()) { 629 if (!nestable_tasks_allowed_ || delayed_work_queue_.empty()) {
613 recent_time_ = *next_delayed_work_time = TimeTicks(); 630 *next_delayed_work_time = TimeTicks();
614 return false; 631 return false;
615 } 632 }
616 633
617 // When we "fall behind", there will be a lot of tasks in the delayed work 634 // When we "fall behind", there will be a lot of tasks in the delayed work
618 // queue that are ready to run. To increase efficiency when we fall behind, 635 // queue that are ready to run. To increase efficiency when we fall behind,
619 // we will only call Time::Now() intermittently, and then process all tasks 636 // we will only call Time::Now() intermittently, and then process all tasks
620 // that are ready to run before calling it again. As a result, the more we 637 // that are ready to run before calling it again. As a result, the more we
621 // fall behind (and have a lot of ready-to-run delayed tasks), the more 638 // fall behind (and have a lot of ready-to-run delayed tasks), the more
622 // efficient we'll be at handling the tasks. 639 // efficient we'll be at handling the tasks.
623 640
624 TimeTicks next_run_time = delayed_work_queue_.top().delayed_run_time; 641 TimeTicks next_run_time = delayed_work_queue_.top().delayed_run_time;
625 if (next_run_time > recent_time_) { 642 if (next_run_time > recent_time_) {
626 recent_time_ = TimeTicks::Now(); // Get a better view of Now();
627 if (next_run_time > recent_time_) { 643 if (next_run_time > recent_time_) {
628 *next_delayed_work_time = next_run_time; 644 *next_delayed_work_time = next_run_time;
629 return false; 645 return false;
630 } 646 }
631 } 647 }
632 648
633 PendingTask pending_task = delayed_work_queue_.top(); 649 PendingTask pending_task = delayed_work_queue_.top();
634 delayed_work_queue_.pop(); 650 delayed_work_queue_.pop();
635 651
636 if (!delayed_work_queue_.empty()) 652 if (!delayed_work_queue_.empty())
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 persistent, 756 persistent,
741 mode, 757 mode,
742 controller, 758 controller,
743 delegate); 759 delegate);
744 } 760 }
745 #endif 761 #endif
746 762
747 #endif // !defined(OS_NACL_SFI) 763 #endif // !defined(OS_NACL_SFI)
748 764
749 } // namespace base 765 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698