// Copyright (c) 2023, AgiBot Inc. // All rights reserved. #pragma once #include #include namespace aimrt::common::util { class LightSignal { public: LightSignal() = default; ~LightSignal() = default; void Notify() { std::lock_guard lck(mutex_); flag_ = true; cond_.notify_all(); } void Wait() { std::unique_lock lck(mutex_); if (flag_) return; cond_.wait(lck); } bool WaitFor(std::chrono::nanoseconds timeout) { std::unique_lock lck(mutex_); if (flag_) return true; if (cond_.wait_for(lck, timeout) == std::cv_status::timeout) return false; return true; } void Reset() { std::lock_guard lck(mutex_); flag_ = false; } private: std::mutex mutex_; std::condition_variable cond_; bool flag_ = false; }; } // namespace aimrt::common::util