From 2c7f4de3e684d6dc9c10c503d1ca05765809b3c4 Mon Sep 17 00:00:00 2001 From: Francis Tsui Date: Wed, 1 Oct 2025 15:23:46 -0700 Subject: [PATCH] Make TimerImpl thread-safe. PiperOrigin-RevId: 813938502 --- internal/platform/BUILD | 17 +---------------- internal/platform/timer_impl.cc | 18 ++++++++++++------ internal/platform/timer_impl.h | 5 ++++- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/internal/platform/BUILD b/internal/platform/BUILD index f84cbb0c..67d6a8cd 100644 --- a/internal/platform/BUILD +++ b/internal/platform/BUILD @@ -253,26 +253,11 @@ cc_library( "timer_impl.h", ], visibility = [ - "//connections:__subpackages__", - "//internal/account:__subpackages__", - "//internal/auth:__subpackages__", - "//internal/auth/credential_store:__subpackages__", - "//internal/base:__subpackages__", - "//internal/crypto:__subpackages__", - "//internal/data:__subpackages__", - "//internal/interop:__pkg__", - "//internal/network:__subpackages__", - "//internal/platform:__subpackages__", - "//internal/preferences:__subpackages__", - "//internal/proto/analytics:__subpackages__", - "//internal/test:__subpackages__", - "//internal/weave:__subpackages__", + "//:__subpackages__", "//location/nearby/apps:__subpackages__", "//location/nearby/cpp:__subpackages__", "//location/nearby/sharing/sdk:__subpackages__", "//location/nearby/testing/nearby_native:__subpackages__", - "//presence:__subpackages__", - "//sharing:__subpackages__", ], deps = [ ":base", diff --git a/internal/platform/timer_impl.cc b/internal/platform/timer_impl.cc index bd9c8159..20aaf455 100644 --- a/internal/platform/timer_impl.cc +++ b/internal/platform/timer_impl.cc @@ -17,6 +17,7 @@ #include #include "absl/functional/any_invocable.h" +#include "absl/synchronization/mutex.h" #include "internal/platform/implementation/platform.h" #include "internal/platform/logging.h" @@ -24,17 +25,18 @@ namespace nearby { bool TimerImpl::Start(int delay, int period, absl::AnyInvocable callback) { - if (internal_timer_ != nullptr) { - LOG(INFO) << "The timer is already running."; - return false; - } - if (delay < 0) { delay = 0; } if (period < 0) { period = 0; } + absl::MutexLock lock(&mutex_); + if (internal_timer_ != nullptr) { + LOG(INFO) << "The timer is already running."; + return false; + } + internal_timer_ = api::ImplementationPlatform::CreateTimer(); if (!internal_timer_->Create(delay, period, std::move(callback))) { LOG(INFO) << "Failed to create timer."; @@ -45,6 +47,7 @@ bool TimerImpl::Start(int delay, int period, } void TimerImpl::Stop() { + absl::MutexLock lock(&mutex_); if (internal_timer_ == nullptr) { return; } @@ -53,6 +56,9 @@ void TimerImpl::Stop() { internal_timer_ = nullptr; } -bool TimerImpl::IsRunning() { return (internal_timer_ != nullptr); } +bool TimerImpl::IsRunning() { + absl::MutexLock lock(&mutex_); + return (internal_timer_ != nullptr); +} } // namespace nearby diff --git a/internal/platform/timer_impl.h b/internal/platform/timer_impl.h index a918fcd8..06eb45f9 100644 --- a/internal/platform/timer_impl.h +++ b/internal/platform/timer_impl.h @@ -17,7 +17,9 @@ #include +#include "absl/base/thread_annotations.h" #include "absl/functional/any_invocable.h" +#include "absl/synchronization/mutex.h" #include "internal/platform/implementation/timer.h" #include "internal/platform/timer.h" @@ -32,7 +34,8 @@ class TimerImpl : public Timer { bool IsRunning() override; private: - std::unique_ptr internal_timer_ = nullptr; + absl::Mutex mutex_; + std::unique_ptr internal_timer_ ABSL_GUARDED_BY(mutex_) = nullptr; }; } // namespace nearby