1#include "SessionsManager.h"
7 void SessionsManager::SessionTime::asyncCheck()
9 unique_lock<mutex> guard(checkLock);
10 vector<pair<SessionTimePoint, string>> deleteVariants;
11 const SessionTimePoint current = chrono::high_resolution_clock::now();
13 for (
const auto& i : timeIp)
15 if ((current - i.first).count() >= sessionLifeTime)
17 deleteVariants.push_back(i);
25 for (
const auto& [time, ip] : deleteVariants)
30 userSessionSynchronization->deleteSession(ip);
36 void SessionsManager::SessionTime::runAsyncCheck()
42 this_thread::sleep_for(sessionCheckPeriod);
46 void SessionsManager::SessionTime::nextPeriod()
48 multimap<SessionTimePoint, string, greater<SessionTimePoint>> tem;
49 const SessionTimePoint period = chrono::high_resolution_clock::now();
51 for (
const auto& [time, ip] : timeIp)
53 SessionTimePoint next = time;
55 next += period - next;
59 tem.emplace(move(next), ip);
65 SessionsManager::SessionTime::SessionTime(SessionsManager* userSession) :
66 userSessionSynchronization(userSession)
68 thread(&SessionTime::runAsyncCheck,
this).detach();
71 void SessionsManager::SessionTime::updateSessionTime(
const string& ip)
73 unique_lock<mutex> guard(checkLock);
75 auto findTime = ipTime.find(ip);
77 if (findTime != ipTime.end())
79 auto target = timeIp.find(findTime->second);
81 while (target->second != ip)
89 SessionTimePoint start = chrono::high_resolution_clock::now();
93 timeIp.emplace(move(start), ip);
96 SessionsManager::SessionsManager() :
102 void SessionsManager::setAttribute(
const string& ip,
const string& name,
const string& value)
104 unique_lock<mutex> guard(lock);
106 userSession[ip][name] = value;
108 time.updateSessionTime(ip);
111 string SessionsManager::getAttribute(
const string& ip,
const string& name)
113 unique_lock guard(lock);
115 time.updateSessionTime(ip);
117 return userSession.at(ip).at(name);
120 void SessionsManager::deleteSession(
const string& ip)
122 unique_lock guard(lock);
124 userSession.erase(ip);
127 void SessionsManager::deleteAttribute(
const string& ip,
const string& name)
129 unique_lock guard(lock);
131 userSession[ip].erase(name);