summaryrefslogtreecommitdiff
path: root/chromium/base/message_loop/timer_slack.cc
blob: f179540bc6c0c8ae81c4b827a2044d06680cc0c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/message_loop/timer_slack.h"

#include <atomic>

#include "base/check_op.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"

namespace base {
namespace features {

const base::Feature kLudicrousTimerSlack{"LudicrousTimerSlack",
                                             base::FEATURE_DISABLED_BY_DEFAULT};

namespace {

constexpr base::FeatureParam<base::TimeDelta> kSlackValueMs{
    &kLudicrousTimerSlack, "slack_ms",
    // 1.5 seconds default slack for this ludicrous experiment.
    base::TimeDelta::FromMilliseconds(1500)};

}  // namespace
}  // namespace features

namespace {

std::atomic<size_t> g_ludicrous_timer_suspend_count{0};

}  // namespace

bool IsLudicrousTimerSlackEnabled() {
  return base::FeatureList::IsEnabled(base::features::kLudicrousTimerSlack);
}

base::TimeDelta GetLudicrousTimerSlack() {
  return features::kSlackValueMs.Get();
}

void SuspendLudicrousTimerSlack() {
  ++g_ludicrous_timer_suspend_count;
}

void ResumeLudicrousTimerSlack() {
  size_t old_count = g_ludicrous_timer_suspend_count.fetch_sub(1);
  DCHECK_LT(0u, old_count);
}

bool IsLudicrousTimerSlackSuspended() {
  return g_ludicrous_timer_suspend_count.load() > 0u;
}

}  // namespace base