OpenFusion/src/core/CNShared.cpp

52 lines
1.3 KiB
C++
Raw Normal View History

#include "core/CNShared.hpp"
2020-08-18 20:42:30 +00:00
2020-08-19 20:42:44 +00:00
#if defined(__MINGW32__) && !defined(_GLIBCXX_HAS_GTHREADS)
2020-08-18 20:42:30 +00:00
#include "mingw/mingw.mutex.h"
#else
2020-08-18 20:42:30 +00:00
#include <mutex>
#endif
static std::unordered_map<int64_t, LoginMetadata*> login;
static std::mutex mtx;
2020-08-18 20:42:30 +00:00
void CNShared::storeLoginMetadata(int64_t sk, LoginMetadata *lm) {
std::lock_guard<std::mutex> lock(mtx);
// take ownership of connection data
login[sk] = lm;
2020-08-18 20:42:30 +00:00
}
LoginMetadata* CNShared::getLoginMetadata(int64_t sk) {
std::lock_guard<std::mutex> lock(mtx);
// fail if the key isn't found
if (login.find(sk) == login.end())
return nullptr;
// transfer ownership of connection data to shard
LoginMetadata *lm = login[sk];
login.erase(sk);
return lm;
2020-08-18 20:42:30 +00:00
}
void CNShared::pruneLoginMetadata(CNServer *serv, time_t currTime) {
std::lock_guard<std::mutex> lock(mtx);
auto it = login.begin();
while (it != login.end()) {
auto& sk = it->first;
auto& lm = it->second;
if (lm->timestamp + CNSHARED_TIMEOUT > currTime) {
std::cout << "[WARN] Pruning hung connection attempt" << std::endl;
2020-08-18 20:42:30 +00:00
// deallocate object and remove map entry
delete login[sk];
it = login.erase(it); // skip the invalidated iterator
} else {
it++;
}
}
2020-08-18 20:42:30 +00:00
}