std::atomic<time_t> lastAccess{0};
};
- ReadWriteLock d_lock;
public:
IsUpOracle()
{
std::vector<std::future<void>> results;
std::vector<CheckDesc> toDelete;
{
- ReadLock lock{&d_lock}; // make sure there's no insertion
- for (auto& it: d_statuses) {
+ // make sure there's no insertion
+ auto statuses = d_statuses.read_lock();
+ for (auto& it: *statuses) {
auto& desc = it.first;
auto& state = it.second;
future.wait();
}
if (!toDelete.empty()) {
- WriteLock lock{&d_lock};
+ auto statuses = d_statuses.write_lock();
for (auto& it: toDelete) {
- d_statuses.erase(it);
+ statuses->erase(it);
}
}
std::this_thread::sleep_until(checkStart + std::chrono::seconds(g_luaHealthChecksInterval));
}
typedef map<CheckDesc, std::unique_ptr<CheckState>> statuses_t;
- statuses_t d_statuses;
+ SharedLockGuarded<statuses_t> d_statuses;
std::unique_ptr<std::thread> d_checkerThread;
void setStatus(const CheckDesc& cd, bool status)
{
- ReadLock lock{&d_lock};
- auto& state = d_statuses[cd];
+ auto statuses = d_statuses.write_lock();
+ auto& state = (*statuses)[cd];
state->status = status;
if (state->first) {
state->first = false;
}
time_t now = time(nullptr);
{
- ReadLock lock{&d_lock};
- auto iter = d_statuses.find(cd);
- if (iter != d_statuses.end()) {
+ auto statuses = d_statuses.read_lock();
+ auto iter = statuses->find(cd);
+ if (iter != statuses->end()) {
iter->second->lastAccess = now;
return iter->second->status;
}
ComboAddress src(cd.opts.at("source"));
}
{
- WriteLock lock{&d_lock};
+ auto statuses = d_statuses.write_lock();
// Make sure we don't insert new entry twice now we have the lock
- if (d_statuses.find(cd) == d_statuses.end()) {
- d_statuses[cd] = std::unique_ptr<CheckState>(new CheckState{now});
+ if (statuses->find(cd) == statuses->end()) {
+ (*statuses)[cd] = std::unique_ptr<CheckState>(new CheckState{now});
}
}
return false;