mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-17 17:33:21 +08:00
[fix] prevent stale device online status
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#ifndef _DEVICE_PRESENCE_CACHE_H_
|
||||
#define _DEVICE_PRESENCE_CACHE_H_
|
||||
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
@@ -15,15 +16,29 @@ namespace crossdesk {
|
||||
|
||||
class DevicePresenceCache {
|
||||
public:
|
||||
void SetOnline(const std::string &device_id, bool online) {
|
||||
using Clock = std::chrono::steady_clock;
|
||||
static constexpr auto kMaxAge = std::chrono::seconds(60);
|
||||
|
||||
void SetSignalConnected(bool connected) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
cache_[device_id] = online;
|
||||
signal_connected_ = connected;
|
||||
cache_.clear();
|
||||
}
|
||||
|
||||
bool IsOnline(const std::string &device_id) const {
|
||||
void SetOnline(const std::string &device_id, bool online,
|
||||
Clock::time_point now = Clock::now()) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (signal_connected_) {
|
||||
cache_[device_id] = {online, now};
|
||||
}
|
||||
}
|
||||
|
||||
bool IsOnline(const std::string &device_id,
|
||||
Clock::time_point now = Clock::now()) const {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
const auto it = cache_.find(device_id);
|
||||
return it != cache_.end() && it->second;
|
||||
return signal_connected_ && it != cache_.end() && it->second.online &&
|
||||
now - it->second.updated_at < kMaxAge;
|
||||
}
|
||||
|
||||
void Clear() {
|
||||
@@ -32,7 +47,12 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, bool> cache_;
|
||||
struct Entry {
|
||||
bool online;
|
||||
Clock::time_point updated_at;
|
||||
};
|
||||
bool signal_connected_ = false;
|
||||
std::unordered_map<std::string, Entry> cache_;
|
||||
mutable std::mutex mutex_;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user