xref: /aosp_15_r20/external/libchrome/libchrome_tools/patches/Fix-TimeDelta.patch (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Workercommit db5f2b6e74d6d2e2a9c6f530199067c1d6eff7b6
2*635a8641SAndroid Build Coastguard WorkerAuthor: Max Morin <[email protected]>
3*635a8641SAndroid Build Coastguard WorkerDate:   Mon Aug 27 09:45:24 2018 +0000
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker    Make TimeDelta TriviallyCopyable for std::atomic.
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker    We're having some awkwardness with working around the issue with stuff
8*635a8641SAndroid Build Coastguard Worker    like std::atomic<int64_t> and conversions back and forth. It would be
9*635a8641SAndroid Build Coastguard Worker    preferable to use std::atomic<TimeDelta> directly.
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker    Removes the workaround added for bug 635974, since that was a bug in
12*635a8641SAndroid Build Coastguard Worker    vs 2015 and we use clang now.
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Worker    Also fixes a couple of lint issues in time.h.
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker    Bug: 635974, 851959, 761570
17*635a8641SAndroid Build Coastguard Worker    Change-Id: I4683f960b0c348748c5f0aaf222da4dda40256ec
18*635a8641SAndroid Build Coastguard Worker    Reviewed-on: https://chromium-review.googlesource.com/1184781
19*635a8641SAndroid Build Coastguard Worker    Commit-Queue: Max Morin <[email protected]>
20*635a8641SAndroid Build Coastguard Worker    Reviewed-by: Yuri Wiitala <[email protected]>
21*635a8641SAndroid Build Coastguard Worker    Reviewed-by: Bruce Dawson <[email protected]>
22*635a8641SAndroid Build Coastguard Worker    Cr-Commit-Position: refs/heads/master@{#586219}
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Workerdiff --git a/base/time/time.h b/base/time/time.h
25*635a8641SAndroid Build Coastguard Workerindex f4c2f93f30b4..7d4f308545c9 100644
26*635a8641SAndroid Build Coastguard Worker--- a/base/time/time.h
27*635a8641SAndroid Build Coastguard Worker+++ b/base/time/time.h
28*635a8641SAndroid Build Coastguard Worker@@ -199,11 +199,6 @@ class BASE_EXPORT TimeDelta {
29*635a8641SAndroid Build Coastguard Worker   double InMicrosecondsF() const;
30*635a8641SAndroid Build Coastguard Worker   int64_t InNanoseconds() const;
31*635a8641SAndroid Build Coastguard Worker
32*635a8641SAndroid Build Coastguard Worker-  constexpr TimeDelta& operator=(TimeDelta other) {
33*635a8641SAndroid Build Coastguard Worker-    delta_ = other.delta_;
34*635a8641SAndroid Build Coastguard Worker-    return *this;
35*635a8641SAndroid Build Coastguard Worker-  }
36*635a8641SAndroid Build Coastguard Worker-
37*635a8641SAndroid Build Coastguard Worker   // Computations with other deltas. Can easily be made constexpr with C++17 but
38*635a8641SAndroid Build Coastguard Worker   // hard to do until then per limitations around
39*635a8641SAndroid Build Coastguard Worker   // __builtin_(add|sub)_overflow in safe_math_clang_gcc_impl.h :
40*635a8641SAndroid Build Coastguard Worker@@ -283,11 +278,6 @@ class BASE_EXPORT TimeDelta {
41*635a8641SAndroid Build Coastguard Worker     return delta_ >= other.delta_;
42*635a8641SAndroid Build Coastguard Worker   }
43*635a8641SAndroid Build Coastguard Worker
44*635a8641SAndroid Build Coastguard Worker-#if defined(OS_WIN)
45*635a8641SAndroid Build Coastguard Worker-  // This works around crbug.com/635974
46*635a8641SAndroid Build Coastguard Worker-  constexpr TimeDelta(const TimeDelta& other) : delta_(other.delta_) {}
47*635a8641SAndroid Build Coastguard Worker-#endif
48*635a8641SAndroid Build Coastguard Worker-
49*635a8641SAndroid Build Coastguard Worker  private:
50*635a8641SAndroid Build Coastguard Worker   friend int64_t time_internal::SaturatedAdd(TimeDelta delta, int64_t value);
51*635a8641SAndroid Build Coastguard Worker   friend int64_t time_internal::SaturatedSub(TimeDelta delta, int64_t value);
52*635a8641SAndroid Build Coastguard Worker@@ -375,7 +365,7 @@ class TimeBase {
53*635a8641SAndroid Build Coastguard Worker   //
54*635a8641SAndroid Build Coastguard Worker   // DEPRECATED - Do not use in new code. For serializing Time values, prefer
55*635a8641SAndroid Build Coastguard Worker   // Time::ToDeltaSinceWindowsEpoch().InMicroseconds(). http://crbug.com/634507
56*635a8641SAndroid Build Coastguard Worker-  int64_t ToInternalValue() const { return us_; }
57*635a8641SAndroid Build Coastguard Worker+  constexpr int64_t ToInternalValue() const { return us_; }
58*635a8641SAndroid Build Coastguard Worker
59*635a8641SAndroid Build Coastguard Worker   // The amount of time since the origin (or "zero") point. This is a syntactic
60*635a8641SAndroid Build Coastguard Worker   // convenience to aid in code readability, mainly for debugging/testing use
61*635a8641SAndroid Build Coastguard Worker@@ -799,7 +789,7 @@ constexpr TimeDelta TimeDelta::FromDouble(double value) {
62*635a8641SAndroid Build Coastguard Worker // static
63*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta TimeDelta::FromProduct(int64_t value,
64*635a8641SAndroid Build Coastguard Worker                                            int64_t positive_value) {
65*635a8641SAndroid Build Coastguard Worker-  DCHECK(positive_value > 0);
66*635a8641SAndroid Build Coastguard Worker+  DCHECK(positive_value > 0);  // NOLINT, DCHECK_GT isn't constexpr.
67*635a8641SAndroid Build Coastguard Worker   return value > std::numeric_limits<int64_t>::max() / positive_value
68*635a8641SAndroid Build Coastguard Worker              ? Max()
69*635a8641SAndroid Build Coastguard Worker              : value < std::numeric_limits<int64_t>::min() / positive_value
70*635a8641SAndroid Build Coastguard Worker@@ -903,8 +893,8 @@ class BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> {
71*635a8641SAndroid Build Coastguard Worker     return TimeTicks(us);
72*635a8641SAndroid Build Coastguard Worker   }
73*635a8641SAndroid Build Coastguard Worker
74*635a8641SAndroid Build Coastguard Worker-#if defined(OS_WIN)
75*635a8641SAndroid Build Coastguard Worker  protected:
76*635a8641SAndroid Build Coastguard Worker+#if defined(OS_WIN)
77*635a8641SAndroid Build Coastguard Worker   typedef DWORD (*TickFunctionType)(void);
78*635a8641SAndroid Build Coastguard Worker   static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
79*635a8641SAndroid Build Coastguard Worker #endif
80*635a8641SAndroid Build Coastguard Worker@@ -926,8 +916,7 @@ BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks);
81*635a8641SAndroid Build Coastguard Worker // thread is running.
82*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ThreadTicks : public time_internal::TimeBase<ThreadTicks> {
83*635a8641SAndroid Build Coastguard Worker  public:
84*635a8641SAndroid Build Coastguard Worker-  ThreadTicks() : TimeBase(0) {
85*635a8641SAndroid Build Coastguard Worker-  }
86*635a8641SAndroid Build Coastguard Worker+  constexpr ThreadTicks() : TimeBase(0) {}
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker   // Returns true if ThreadTicks::Now() is supported on this system.
89*635a8641SAndroid Build Coastguard Worker   static bool IsSupported() WARN_UNUSED_RESULT {
90*635a8641SAndroid Build Coastguard Workerdiff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
91*635a8641SAndroid Build Coastguard Workerindex 5dc8888a3297..ce8cc39cbaec 100644
92*635a8641SAndroid Build Coastguard Worker--- a/base/time/time_unittest.cc
93*635a8641SAndroid Build Coastguard Worker+++ b/base/time/time_unittest.cc
94*635a8641SAndroid Build Coastguard Worker@@ -1542,6 +1542,70 @@ TEST(TimeDelta, Overflows) {
95*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kOneSecond, (ticks_now + kOneSecond) - ticks_now);
96*635a8641SAndroid Build Coastguard Worker }
97*635a8641SAndroid Build Coastguard Worker
98*635a8641SAndroid Build Coastguard Worker+constexpr TimeTicks TestTimeTicksConstexprCopyAssignment() {
99*635a8641SAndroid Build Coastguard Worker+  TimeTicks a = TimeTicks::FromInternalValue(12345);
100*635a8641SAndroid Build Coastguard Worker+  TimeTicks b;
101*635a8641SAndroid Build Coastguard Worker+  b = a;
102*635a8641SAndroid Build Coastguard Worker+  return b;
103*635a8641SAndroid Build Coastguard Worker+}
104*635a8641SAndroid Build Coastguard Worker+
105*635a8641SAndroid Build Coastguard Worker+TEST(TimeTicks, ConstexprAndTriviallyCopiable) {
106*635a8641SAndroid Build Coastguard Worker+  // "Trivially copyable" is necessary for use in std::atomic<TimeTicks>.
107*635a8641SAndroid Build Coastguard Worker+  static_assert(std::is_trivially_copyable<TimeTicks>(), "");
108*635a8641SAndroid Build Coastguard Worker+
109*635a8641SAndroid Build Coastguard Worker+  // Copy ctor.
110*635a8641SAndroid Build Coastguard Worker+  constexpr TimeTicks a = TimeTicks::FromInternalValue(12345);
111*635a8641SAndroid Build Coastguard Worker+  constexpr TimeTicks b{a};
112*635a8641SAndroid Build Coastguard Worker+  static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
113*635a8641SAndroid Build Coastguard Worker+
114*635a8641SAndroid Build Coastguard Worker+  // Copy assignment.
115*635a8641SAndroid Build Coastguard Worker+  static_assert(a.ToInternalValue() ==
116*635a8641SAndroid Build Coastguard Worker+                    TestTimeTicksConstexprCopyAssignment().ToInternalValue(),
117*635a8641SAndroid Build Coastguard Worker+                "");
118*635a8641SAndroid Build Coastguard Worker+}
119*635a8641SAndroid Build Coastguard Worker+
120*635a8641SAndroid Build Coastguard Worker+constexpr ThreadTicks TestThreadTicksConstexprCopyAssignment() {
121*635a8641SAndroid Build Coastguard Worker+  ThreadTicks a = ThreadTicks::FromInternalValue(12345);
122*635a8641SAndroid Build Coastguard Worker+  ThreadTicks b;
123*635a8641SAndroid Build Coastguard Worker+  b = a;
124*635a8641SAndroid Build Coastguard Worker+  return b;
125*635a8641SAndroid Build Coastguard Worker+}
126*635a8641SAndroid Build Coastguard Worker+
127*635a8641SAndroid Build Coastguard Worker+TEST(ThreadTicks, ConstexprAndTriviallyCopiable) {
128*635a8641SAndroid Build Coastguard Worker+  // "Trivially copyable" is necessary for use in std::atomic<ThreadTicks>.
129*635a8641SAndroid Build Coastguard Worker+  static_assert(std::is_trivially_copyable<ThreadTicks>(), "");
130*635a8641SAndroid Build Coastguard Worker+
131*635a8641SAndroid Build Coastguard Worker+  // Copy ctor.
132*635a8641SAndroid Build Coastguard Worker+  constexpr ThreadTicks a = ThreadTicks::FromInternalValue(12345);
133*635a8641SAndroid Build Coastguard Worker+  constexpr ThreadTicks b{a};
134*635a8641SAndroid Build Coastguard Worker+  static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
135*635a8641SAndroid Build Coastguard Worker+
136*635a8641SAndroid Build Coastguard Worker+  // Copy assignment.
137*635a8641SAndroid Build Coastguard Worker+  static_assert(a.ToInternalValue() ==
138*635a8641SAndroid Build Coastguard Worker+                    TestThreadTicksConstexprCopyAssignment().ToInternalValue(),
139*635a8641SAndroid Build Coastguard Worker+                "");
140*635a8641SAndroid Build Coastguard Worker+}
141*635a8641SAndroid Build Coastguard Worker+
142*635a8641SAndroid Build Coastguard Worker+constexpr TimeDelta TestTimeDeltaConstexprCopyAssignment() {
143*635a8641SAndroid Build Coastguard Worker+  TimeDelta a = TimeDelta::FromSeconds(1);
144*635a8641SAndroid Build Coastguard Worker+  TimeDelta b;
145*635a8641SAndroid Build Coastguard Worker+  b = a;
146*635a8641SAndroid Build Coastguard Worker+  return b;
147*635a8641SAndroid Build Coastguard Worker+}
148*635a8641SAndroid Build Coastguard Worker+
149*635a8641SAndroid Build Coastguard Worker+TEST(TimeDelta, ConstexprAndTriviallyCopiable) {
150*635a8641SAndroid Build Coastguard Worker+  // "Trivially copyable" is necessary for use in std::atomic<TimeDelta>.
151*635a8641SAndroid Build Coastguard Worker+  static_assert(std::is_trivially_copyable<TimeDelta>(), "");
152*635a8641SAndroid Build Coastguard Worker+
153*635a8641SAndroid Build Coastguard Worker+  // Copy ctor.
154*635a8641SAndroid Build Coastguard Worker+  constexpr TimeDelta a = TimeDelta::FromSeconds(1);
155*635a8641SAndroid Build Coastguard Worker+  constexpr TimeDelta b{a};
156*635a8641SAndroid Build Coastguard Worker+  static_assert(a == b, "");
157*635a8641SAndroid Build Coastguard Worker+
158*635a8641SAndroid Build Coastguard Worker+  // Copy assignment.
159*635a8641SAndroid Build Coastguard Worker+  static_assert(a == TestTimeDeltaConstexprCopyAssignment(), "");
160*635a8641SAndroid Build Coastguard Worker+}
161*635a8641SAndroid Build Coastguard Worker+
162*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, DCheckEqCompiles) {
163*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(TimeDelta(), TimeDelta());
164*635a8641SAndroid Build Coastguard Worker }
165