added: gc for sessions (another thread)

git-svn-id: svn://ttmath.org/publicrep/winix/trunk@693 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2010-12-07 12:52:52 +00:00
parent 7f77b6e3ec
commit 0a9cdd2f15
16 changed files with 434 additions and 393 deletions

View File

@@ -22,7 +22,6 @@
SessionManager::SessionManager()
{
session_checker = 0;
}
@@ -36,6 +35,7 @@ void SessionManager::SetRequest(Request * prequest)
void SessionManager::SetConfig(Config * pconfig)
{
config = pconfig;
session_tab.SetConfig(pconfig);
}
@@ -50,6 +50,12 @@ void SessionManager::SetLastContainer(LastContainer * plast_container)
}
void SessionManager::SetSynchro(Synchro * psynchro)
{
session_tab.SetSynchro(psynchro);
}
size_t SessionManager::Size()
{
return session_tab.Size();
@@ -105,6 +111,7 @@ void SessionManager::CreateTemporarySession()
{
Session s;
s.id = 0;
s.new_session = true;
session_tab.PushBack(s);
request->session = &session_tab.Back();
@@ -112,6 +119,7 @@ void SessionManager::CreateTemporarySession()
else
{
request->session = &(*i);
request->session->new_session = false;
}
}
@@ -158,8 +166,9 @@ bool SessionManager::SetSessionFromCookie(const std::string & cookie)
// that session is in the table
request->session = &(*s);
request->session->new_session = false;
session_tab.UpdateLastTime(s, std::time(0));
request->session->new_session = false;
request->session->last_time = std::time(0);
request->session->tm_last_time = Time(request->session->last_time);
if( request->method == Request::get )
request->session->last_time_get = request->session->last_time;
@@ -225,48 +234,11 @@ SessionContainer::Iterator SessionManager::SessionEnd()
void SessionManager::DeleteOldSessions()
{
size_t deleted;
deleted = session_tab.DelFirstByTimeInterval(config->session_max_idle, 100); // !! dodac do konfiga
if( ++session_checker > 1000 )
{
// we make the test after 1000 requests
//log << log3 << "SM: checking sessions which have 'remember me' flag set" << logend;
session_checker = 0;
deleted += session_tab.DelFirstByTimeInterval(config->session_remember_max_idle, 100, false);
}
if( deleted > 0 )
log << log3 << "SM: deleted " << deleted << " outdated sessions" << logend;
}
void SessionManager::DeleteSessions()
{
// first we delete all plugins date
/*
SessionContainer::Iterator i = session_tab.Begin();
Session * old_session = request->session;
for( ; i!=session_tab.End() ; ++i )
{
request->session = &(*i);
i->plugin_data.DeleteAll();
}
request->session = old_session;
*/
// and now we delete all sessions
session_tab.Clear();
}
@@ -335,5 +307,24 @@ void SessionManager::SaveSessions()
void SessionManager::StartGC()
{
session_tab.StartThread();
}
// use it with Lock() and Unlock();
void SessionManager::PrepareToStopGC()
{
session_tab.WakeUpThread();
}
void SessionManager::WaitForGC()
{
session_tab.WaitForThread();
}