Skip to content

Commit 73635a1

Browse files
author
Gabriel Charette
committed
[Merge M69] [MessageLoop] Do not schedule sleeps > 1 day
Some platforms don't like timeouts > 100,000,000 seconds. Note: I tried just banning long delays but it didn't work (https://bugs.chromium.org/p/chromium/issues/detail?id=850450#c4). And while we could control delays posted by our codebase (and we should still try to address that), we can't control those set from Javascript. TBR=​kylechar@chromium.org Bug: 850450 Change-Id: Iaf1b983b7af1954412518ed049f6cd0a3f78ba2a Reviewed-on: https://chromium-review.googlesource.com/1142602 Commit-Queue: Gabriel Charette <gab@chromium.org> Reviewed-by: kylechar <kylechar@chromium.org> Cr-Original-Commit-Position: refs/heads/master@{#576857}(cherry picked from commit 5bd9b57) Reviewed-on: https://chromium-review.googlesource.com/1150581 Reviewed-by: Gabriel Charette <gab@chromium.org> Cr-Commit-Position: refs/branch-heads/3497@{#84} Cr-Branched-From: 271eaf5-refs/heads/master@{#576753}
1 parent 05cac71 commit 73635a1

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

base/message_loop/message_loop.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ void MessageLoop::ScheduleWork() {
454454
pump_->ScheduleWork();
455455
}
456456

457+
TimeTicks MessageLoop::CapAtOneDay(TimeTicks next_run_time) {
458+
return std::min(next_run_time, recent_time_ + TimeDelta::FromDays(1));
459+
}
460+
457461
bool MessageLoop::DoWork() {
458462
if (!task_execution_allowed_)
459463
return false;
@@ -502,16 +506,16 @@ bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
502506
if (next_run_time > recent_time_) {
503507
recent_time_ = TimeTicks::Now(); // Get a better view of Now();
504508
if (next_run_time > recent_time_) {
505-
*next_delayed_work_time = next_run_time;
509+
*next_delayed_work_time = CapAtOneDay(next_run_time);
506510
return false;
507511
}
508512
}
509513

510514
PendingTask pending_task = incoming_task_queue_->delayed_tasks().Pop();
511515

512516
if (incoming_task_queue_->delayed_tasks().HasTasks()) {
513-
*next_delayed_work_time =
514-
incoming_task_queue_->delayed_tasks().Peek().delayed_run_time;
517+
*next_delayed_work_time = CapAtOneDay(
518+
incoming_task_queue_->delayed_tasks().Peek().delayed_run_time);
515519
}
516520

517521
return DeferOrRunPendingTask(std::move(pending_task));

base/message_loop/message_loop.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,14 @@ class BASE_EXPORT MessageLoop : public MessagePump::Delegate,
263263
// responsible for synchronizing ScheduleWork() calls.
264264
void ScheduleWork();
265265

266+
// Returns |next_run_time| capped at 1 day from |recent_time_|. This is used
267+
// to mitigate https://crbug.com/850450 where some platforms are unhappy with
268+
// delays > 100,000,000 seconds. In practice, a diagnosis metric showed that
269+
// no sleep > 1 hour ever completes (always interrupted by an earlier
270+
// MessageLoop event) and 99% of completed sleeps are the ones scheduled for
271+
// <= 1 second. Details @ https://crrev.com/c/1142589.
272+
TimeTicks CapAtOneDay(TimeTicks next_run_time);
273+
266274
// MessagePump::Delegate methods:
267275
bool DoWork() override;
268276
bool DoDelayedWork(TimeTicks* next_delayed_work_time) override;

0 commit comments

Comments
 (0)