Makes Clock interface fully mutable.
Calls to the time functions in Clock can have side effects in some circumstances. It's also questionable if it's a good idea to allow repeated calls to a const method return different values without any changed to the class instance. Bug: webrtc:10270 Change-Id: I316f9788adac954c52b0f9230881b872c54a7ac9 Reviewed-on: https://webrtc-review.googlesource.com/c/120348 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26482}
This commit is contained in:
parent
7e0ae16c73
commit
2a96ab20b2
@ -32,17 +32,17 @@ class Clock {
|
||||
|
||||
// Return a timestamp in milliseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
virtual int64_t TimeInMilliseconds() const = 0;
|
||||
virtual int64_t TimeInMilliseconds() = 0;
|
||||
|
||||
// Return a timestamp in microseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
virtual int64_t TimeInMicroseconds() const = 0;
|
||||
virtual int64_t TimeInMicroseconds() = 0;
|
||||
|
||||
// Retrieve an NTP absolute timestamp.
|
||||
virtual NtpTime CurrentNtpTime() const = 0;
|
||||
virtual NtpTime CurrentNtpTime() = 0;
|
||||
|
||||
// Retrieve an NTP absolute timestamp in milliseconds.
|
||||
virtual int64_t CurrentNtpInMilliseconds() const = 0;
|
||||
virtual int64_t CurrentNtpInMilliseconds() = 0;
|
||||
|
||||
// Converts an NTP timestamp to a millisecond timestamp.
|
||||
static int64_t NtpToMs(uint32_t seconds, uint32_t fractions) {
|
||||
@ -61,17 +61,17 @@ class SimulatedClock : public Clock {
|
||||
|
||||
// Return a timestamp in milliseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
int64_t TimeInMilliseconds() const override;
|
||||
int64_t TimeInMilliseconds() override;
|
||||
|
||||
// Return a timestamp in microseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
int64_t TimeInMicroseconds() const override;
|
||||
int64_t TimeInMicroseconds() override;
|
||||
|
||||
// Retrieve an NTP absolute timestamp.
|
||||
NtpTime CurrentNtpTime() const override;
|
||||
NtpTime CurrentNtpTime() override;
|
||||
|
||||
// Converts an NTP timestamp to a millisecond timestamp.
|
||||
int64_t CurrentNtpInMilliseconds() const override;
|
||||
int64_t CurrentNtpInMilliseconds() override;
|
||||
|
||||
// Advance the simulated clock with a given number of milliseconds or
|
||||
// microseconds.
|
||||
|
||||
@ -34,14 +34,14 @@ namespace webrtc {
|
||||
class RealTimeClock : public Clock {
|
||||
// Return a timestamp in milliseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
int64_t TimeInMilliseconds() const override { return rtc::TimeMillis(); }
|
||||
int64_t TimeInMilliseconds() override { return rtc::TimeMillis(); }
|
||||
|
||||
// Return a timestamp in microseconds relative to some arbitrary source; the
|
||||
// source is fixed for this clock.
|
||||
int64_t TimeInMicroseconds() const override { return rtc::TimeMicros(); }
|
||||
int64_t TimeInMicroseconds() override { return rtc::TimeMicros(); }
|
||||
|
||||
// Retrieve an NTP absolute timestamp.
|
||||
NtpTime CurrentNtpTime() const override {
|
||||
NtpTime CurrentNtpTime() override {
|
||||
timeval tv = CurrentTimeVal();
|
||||
double microseconds_in_seconds;
|
||||
uint32_t seconds;
|
||||
@ -52,7 +52,7 @@ class RealTimeClock : public Clock {
|
||||
}
|
||||
|
||||
// Retrieve an NTP absolute timestamp in milliseconds.
|
||||
int64_t CurrentNtpInMilliseconds() const override {
|
||||
int64_t CurrentNtpInMilliseconds() override {
|
||||
timeval tv = CurrentTimeVal();
|
||||
uint32_t seconds;
|
||||
double microseconds_in_seconds;
|
||||
@ -62,7 +62,7 @@ class RealTimeClock : public Clock {
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual timeval CurrentTimeVal() const = 0;
|
||||
virtual timeval CurrentTimeVal() = 0;
|
||||
|
||||
static void Adjust(const timeval& tv,
|
||||
uint32_t* adjusted_s,
|
||||
@ -87,7 +87,7 @@ class WinUwpRealTimeClock final : public RealTimeClock {
|
||||
~WinUwpRealTimeClock() override {}
|
||||
|
||||
protected:
|
||||
timeval CurrentTimeVal() const override {
|
||||
timeval CurrentTimeVal() override {
|
||||
// The rtc::SystemTimeNanos() method is already time offset from a base
|
||||
// epoch value and might as be synchronized against an NTP time server as
|
||||
// an added bonus.
|
||||
@ -104,7 +104,7 @@ class WinUwpRealTimeClock final : public RealTimeClock {
|
||||
|
||||
#elif defined(WEBRTC_WIN)
|
||||
// TODO(pbos): Consider modifying the implementation to synchronize itself
|
||||
// against system time (update ref_point_, make it non-const) periodically to
|
||||
// against system time (update ref_point_) periodically to
|
||||
// prevent clock drift.
|
||||
class WindowsRealTimeClock : public RealTimeClock {
|
||||
public:
|
||||
@ -121,7 +121,7 @@ class WindowsRealTimeClock : public RealTimeClock {
|
||||
LARGE_INTEGER counter_ms;
|
||||
};
|
||||
|
||||
timeval CurrentTimeVal() const override {
|
||||
timeval CurrentTimeVal() override {
|
||||
const uint64_t FILETIME_1970 = 0x019db1ded53e8000;
|
||||
|
||||
FILETIME StartTime;
|
||||
@ -143,7 +143,7 @@ class WindowsRealTimeClock : public RealTimeClock {
|
||||
return tv;
|
||||
}
|
||||
|
||||
void GetTime(FILETIME* current_time) const {
|
||||
void GetTime(FILETIME* current_time) {
|
||||
DWORD t;
|
||||
LARGE_INTEGER elapsed_ms;
|
||||
{
|
||||
@ -197,10 +197,9 @@ class WindowsRealTimeClock : public RealTimeClock {
|
||||
return ref;
|
||||
}
|
||||
|
||||
// mutable as time-accessing functions are const.
|
||||
rtc::CriticalSection crit_;
|
||||
mutable DWORD last_time_ms_;
|
||||
mutable LONG num_timer_wraps_;
|
||||
DWORD last_time_ms_;
|
||||
LONG num_timer_wraps_;
|
||||
const ReferencePoint ref_point_;
|
||||
};
|
||||
|
||||
@ -212,7 +211,7 @@ class UnixRealTimeClock : public RealTimeClock {
|
||||
~UnixRealTimeClock() override {}
|
||||
|
||||
protected:
|
||||
timeval CurrentTimeVal() const override {
|
||||
timeval CurrentTimeVal() override {
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
tz.tz_minuteswest = 0;
|
||||
@ -241,17 +240,17 @@ SimulatedClock::SimulatedClock(int64_t initial_time_us)
|
||||
|
||||
SimulatedClock::~SimulatedClock() {}
|
||||
|
||||
int64_t SimulatedClock::TimeInMilliseconds() const {
|
||||
int64_t SimulatedClock::TimeInMilliseconds() {
|
||||
ReadLockScoped synchronize(*lock_);
|
||||
return (time_us_ + 500) / 1000;
|
||||
}
|
||||
|
||||
int64_t SimulatedClock::TimeInMicroseconds() const {
|
||||
int64_t SimulatedClock::TimeInMicroseconds() {
|
||||
ReadLockScoped synchronize(*lock_);
|
||||
return time_us_;
|
||||
}
|
||||
|
||||
NtpTime SimulatedClock::CurrentNtpTime() const {
|
||||
NtpTime SimulatedClock::CurrentNtpTime() {
|
||||
int64_t now_ms = TimeInMilliseconds();
|
||||
uint32_t seconds = (now_ms / 1000) + kNtpJan1970;
|
||||
uint32_t fractions =
|
||||
@ -259,7 +258,7 @@ NtpTime SimulatedClock::CurrentNtpTime() const {
|
||||
return NtpTime(seconds, fractions);
|
||||
}
|
||||
|
||||
int64_t SimulatedClock::CurrentNtpInMilliseconds() const {
|
||||
int64_t SimulatedClock::CurrentNtpInMilliseconds() {
|
||||
return TimeInMilliseconds() + 1000 * static_cast<int64_t>(kNtpJan1970);
|
||||
}
|
||||
|
||||
|
||||
@ -31,15 +31,15 @@ float DriftingClock::Drift() const {
|
||||
return (now - start_time_) * drift_;
|
||||
}
|
||||
|
||||
int64_t DriftingClock::TimeInMilliseconds() const {
|
||||
int64_t DriftingClock::TimeInMilliseconds() {
|
||||
return clock_->TimeInMilliseconds() + Drift() / 1000.;
|
||||
}
|
||||
|
||||
int64_t DriftingClock::TimeInMicroseconds() const {
|
||||
int64_t DriftingClock::TimeInMicroseconds() {
|
||||
return clock_->TimeInMicroseconds() + Drift();
|
||||
}
|
||||
|
||||
NtpTime DriftingClock::CurrentNtpTime() const {
|
||||
NtpTime DriftingClock::CurrentNtpTime() {
|
||||
// NTP precision is 1/2^32 seconds, i.e. 2^32 ntp fractions = 1 second.
|
||||
const double kNtpFracPerMicroSecond = 4294.967296; // = 2^32 / 10^6
|
||||
|
||||
@ -49,7 +49,7 @@ NtpTime DriftingClock::CurrentNtpTime() const {
|
||||
return NtpTime(total_fractions);
|
||||
}
|
||||
|
||||
int64_t DriftingClock::CurrentNtpInMilliseconds() const {
|
||||
int64_t DriftingClock::CurrentNtpInMilliseconds() {
|
||||
return clock_->CurrentNtpInMilliseconds() + Drift() / 1000.;
|
||||
}
|
||||
} // namespace test
|
||||
|
||||
@ -30,10 +30,10 @@ class DriftingClock : public Clock {
|
||||
static float PercentsFaster(float percent) { return 1.0f + percent / 100.0f; }
|
||||
static float PercentsSlower(float percent) { return 1.0f - percent / 100.0f; }
|
||||
|
||||
int64_t TimeInMilliseconds() const override;
|
||||
int64_t TimeInMicroseconds() const override;
|
||||
NtpTime CurrentNtpTime() const override;
|
||||
int64_t CurrentNtpInMilliseconds() const override;
|
||||
int64_t TimeInMilliseconds() override;
|
||||
int64_t TimeInMicroseconds() override;
|
||||
NtpTime CurrentNtpTime() override;
|
||||
int64_t CurrentNtpInMilliseconds() override;
|
||||
|
||||
private:
|
||||
float Drift() const;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user