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

Unified Diff: components/scheduler/base/real_time_domain.cc

Issue 1468443002: Reduce the number of delayed tasks on chromium run loop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Weak pointer Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/scheduler/base/real_time_domain.h ('k') | components/scheduler/base/task_queue_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/scheduler/base/real_time_domain.cc
diff --git a/components/scheduler/base/real_time_domain.cc b/components/scheduler/base/real_time_domain.cc
index 8a57a0415cf3181d1d2117a587b3c7009459417e..c3b4505fb1aa7967114cd15c06e63588b5397dbd 100644
--- a/components/scheduler/base/real_time_domain.cc
+++ b/components/scheduler/base/real_time_domain.cc
@@ -10,29 +10,59 @@
namespace scheduler {
-RealTimeDomain::RealTimeDomain(
+RealTimeDomain::RealTimeDomain() : weak_factory_(this) {}
+
+RealTimeDomain::~RealTimeDomain() {}
+
+void RealTimeDomain::OnRegisterWithTaskQueueManager(
TaskQueueManagerDelegate* task_queue_manager_delegate,
- base::Closure do_work_closure)
- : task_queue_manager_delegate_(task_queue_manager_delegate),
- do_work_closure_(do_work_closure) {
+ base::Closure do_work_closure) {
+ task_queue_manager_delegate_ = task_queue_manager_delegate;
+ do_work_closure_ = do_work_closure;
DCHECK(task_queue_manager_delegate_);
}
-RealTimeDomain::~RealTimeDomain() {}
-
LazyNow RealTimeDomain::CreateLazyNow() {
+ DCHECK(task_queue_manager_delegate_);
return LazyNow(task_queue_manager_delegate_);
}
-void RealTimeDomain::RequestWakeup(base::TimeDelta delay) {
- task_queue_manager_delegate_->PostDelayedTask(FROM_HERE, do_work_closure_,
- delay);
+void RealTimeDomain::RequestWakeup(LazyNow* lazy_now, base::TimeDelta delay) {
+ PostWrappedDoWork(lazy_now->Now(), lazy_now->Now() + delay);
}
bool RealTimeDomain::MaybeAdvanceTime() {
+ base::TimeTicks next_run_time;
+ if (!NextScheduledRunTime(&next_run_time))
+ return false;
+
+ DCHECK(task_queue_manager_delegate_);
+ base::TimeTicks now = task_queue_manager_delegate_->NowTicks();
+ if (now >= next_run_time)
+ return true;
+
+ PostWrappedDoWork(now, next_run_time);
return false;
}
+void RealTimeDomain::PostWrappedDoWork(base::TimeTicks now,
+ base::TimeTicks run_time) {
+ DCHECK_GE(run_time, now);
+ DCHECK(task_queue_manager_delegate_);
+ if (pending_wakeups_.insert(run_time).second) {
+ task_queue_manager_delegate_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&RealTimeDomain::WrappedDoWorkTask,
+ weak_factory_.GetWeakPtr(), run_time),
+ run_time - now);
+ }
+}
+
+void RealTimeDomain::WrappedDoWorkTask(base::TimeTicks run_time) {
+ pending_wakeups_.erase(run_time);
+ do_work_closure_.Run();
+}
+
void RealTimeDomain::AsValueIntoInternal(
base::trace_event::TracedValue* state) const {}
« no previous file with comments | « components/scheduler/base/real_time_domain.h ('k') | components/scheduler/base/task_queue_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698