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