diff --git a/src/base/BUILD.bazel b/src/base/BUILD.bazel index 3f6d2a624..6af632e87 100644 --- a/src/base/BUILD.bazel +++ b/src/base/BUILD.bazel @@ -208,7 +208,6 @@ mozc_cc_library( srcs = ["clock.cc"], hdrs = ["clock.h"], deps = [ - ":singleton", "@com_google_absl//absl/time", ], ) diff --git a/src/base/clock.cc b/src/base/clock.cc index 17fe19462..7674faddc 100644 --- a/src/base/clock.cc +++ b/src/base/clock.cc @@ -33,7 +33,8 @@ #include "absl/time/clock.h" #include "absl/time/time.h" -#include "base/singleton.h" + +#include #if defined(OS_CHROMEOS) || defined(_WIN32) constexpr bool kUseAbslLocalTimeZone = false; @@ -46,6 +47,8 @@ constexpr bool kUseAbslLocalTimeZone = true; namespace mozc { namespace { +constinit static std::atomic g_mock = nullptr; + absl::TimeZone GetLocalTimeZone() { if constexpr (kUseAbslLocalTimeZone) { return absl::LocalTimeZone(); @@ -65,27 +68,26 @@ absl::TimeZone GetLocalTimeZone() { } } -class ClockImpl : public ClockInterface { - public: - ClockImpl() = default; - ~ClockImpl() override = default; - - absl::Time GetAbslTime() override { return absl::Now(); } - - absl::TimeZone GetTimeZone() override { return GetLocalTimeZone(); } -}; } // namespace -using ClockSingleton = SingletonMockable; - -absl::Time Clock::GetAbslTime() { return ClockSingleton::Get()->GetAbslTime(); } +absl::Time Clock::GetAbslTime() { + if (ClockInterface* mock = g_mock.load(std::memory_order_acquire); + mock != nullptr) { + return mock->GetAbslTime(); + } + return absl::Now(); +} absl::TimeZone Clock::GetTimeZone() { - return ClockSingleton::Get()->GetTimeZone(); + if (ClockInterface* mock = g_mock.load(std::memory_order_acquire); + mock != nullptr) { + return mock->GetTimeZone(); + } + return GetLocalTimeZone(); } void Clock::SetClockForUnitTest(ClockInterface* clock) { - ClockSingleton::SetMock(clock); + g_mock.store(clock, std::memory_order_release); } } // namespace mozc