diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/TimeWithDynamicClockType.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/TimeWithDynamicClockType.cpp')
-rw-r--r-- | Source/WTF/wtf/TimeWithDynamicClockType.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/Source/WTF/wtf/TimeWithDynamicClockType.cpp b/Source/WTF/wtf/TimeWithDynamicClockType.cpp new file mode 100644 index 000000000..789099f67 --- /dev/null +++ b/Source/WTF/wtf/TimeWithDynamicClockType.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2016 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "TimeWithDynamicClockType.h" + +#include "Condition.h" +#include "Lock.h" +#include "PrintStream.h" +#include <cfloat> +#include <cmath> +#include <wtf/DataLog.h> + +namespace WTF { + +TimeWithDynamicClockType TimeWithDynamicClockType::now(ClockType type) +{ + switch (type) { + case ClockType::Wall: + return WallTime::now(); + case ClockType::Monotonic: + return MonotonicTime::now(); + } + RELEASE_ASSERT_NOT_REACHED(); + return TimeWithDynamicClockType(); +} + +TimeWithDynamicClockType TimeWithDynamicClockType::nowWithSameClock() const +{ + return now(clockType()); +} + +WallTime TimeWithDynamicClockType::wallTime() const +{ + RELEASE_ASSERT(m_type == ClockType::Wall); + return WallTime::fromRawSeconds(m_value); +} + +MonotonicTime TimeWithDynamicClockType::monotonicTime() const +{ + RELEASE_ASSERT(m_type == ClockType::Monotonic); + return MonotonicTime::fromRawSeconds(m_value); +} + +WallTime TimeWithDynamicClockType::approximateWallTime() const +{ + switch (m_type) { + case ClockType::Wall: + return wallTime(); + case ClockType::Monotonic: + return monotonicTime().approximateWallTime(); + } + RELEASE_ASSERT_NOT_REACHED(); + return WallTime(); +} + +MonotonicTime TimeWithDynamicClockType::approximateMonotonicTime() const +{ + switch (m_type) { + case ClockType::Wall: + return wallTime().approximateMonotonicTime(); + case ClockType::Monotonic: + return monotonicTime(); + } + RELEASE_ASSERT_NOT_REACHED(); + return MonotonicTime(); +} + +Seconds TimeWithDynamicClockType::operator-(const TimeWithDynamicClockType& other) const +{ + RELEASE_ASSERT(m_type == other.m_type); + return Seconds(m_value - other.m_value); +} + +bool TimeWithDynamicClockType::operator<(const TimeWithDynamicClockType& other) const +{ + RELEASE_ASSERT(m_type == other.m_type); + return m_value < other.m_value; +} + +bool TimeWithDynamicClockType::operator>(const TimeWithDynamicClockType& other) const +{ + RELEASE_ASSERT(m_type == other.m_type); + return m_value > other.m_value; +} + +bool TimeWithDynamicClockType::operator<=(const TimeWithDynamicClockType& other) const +{ + RELEASE_ASSERT(m_type == other.m_type); + return m_value <= other.m_value; +} + +bool TimeWithDynamicClockType::operator>=(const TimeWithDynamicClockType& other) const +{ + RELEASE_ASSERT(m_type == other.m_type); + return m_value >= other.m_value; +} + +void TimeWithDynamicClockType::dump(PrintStream& out) const +{ + out.print(m_type, "(", m_value, " sec)"); +} + +void sleep(const TimeWithDynamicClockType& time) +{ + Lock fakeLock; + Condition fakeCondition; + LockHolder fakeLocker(fakeLock); + fakeCondition.waitUntil(fakeLock, time); +} + +bool hasElapsed(const TimeWithDynamicClockType& time) +{ + // Avoid doing now(). + if (!(time > time.withSameClockAndRawSeconds(0))) + return true; + if (std::isinf(time.secondsSinceEpoch().value())) + return false; + + return time <= time.nowWithSameClock(); +} + +} // namespace WTF + + |