summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-01-08 04:07:04 +0000
committerpeavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7>2007-01-08 04:07:04 +0000
commit9f13269062094853b023d09b4ac24d2cf08a0de2 (patch)
treebae6c4deeac0635edcea147ab728df74da32f5c9 /src
parentbf3acfa61d702eef0303bc4743592669cebebabf (diff)
Move whowas containers into whowas class to avoid all cpp files including cmd_whowas.h to try and destroy the containers on fork exit.\nThis would cause a segfault when forking due to the containers destroy being called multiple times, but still allow the server to fork it's child and leave the server running.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6260 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/cmd_whowas.cpp44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/cmd_whowas.cpp b/src/cmd_whowas.cpp
index d5f2353b2..6b2d31919 100644
--- a/src/cmd_whowas.cpp
+++ b/src/cmd_whowas.cpp
@@ -90,7 +90,7 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
user->WriteServ("369 %s %s :End of WHOWAS",user->nick,parameters[0]);
return CMD_SUCCESS;
-};
+}
CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters)
{
@@ -108,11 +108,15 @@ CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<cla
PruneWhoWas(ServerInstance->Time());
break;
+ case WHOWAS_MAINTAIN:
+ MaintainWhoWas(ServerInstance->Time());
+ break;
+
default:
break;
}
return CMD_SUCCESS;
-};
+}
void cmd_whowas::GetStats(Extensible* ext)
{
@@ -263,6 +267,24 @@ void cmd_whowas::PruneWhoWas(time_t t)
}
}
+/* call maintain once an hour to remove expired nicks */
+void cmd_whowas::MaintainWhoWas(time_t t)
+{
+ for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+ {
+ whowas_set* n = (whowas_set*)iter->second;
+ if (n->size())
+ {
+ while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
+ {
+ WhoWasGroup *a = *(n->begin());
+ DELETE(a);
+ n->erase(n->begin());
+ }
+ }
+ }
+}
+
cmd_whowas::~cmd_whowas()
{
if (timer)
@@ -279,7 +301,7 @@ cmd_whowas::~cmd_whowas()
if (iter == whowas.end())
{
/* this should never happen, if it does maps are corrupt */
- ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (1)");
+ ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (3)");
return;
}
whowas_set* n = (whowas_set*)iter->second;
@@ -322,19 +344,13 @@ WhoWasGroup::~WhoWasGroup()
/* every hour, run this function which removes all entries older than Config->WhoWasMaxKeep */
void MaintainTimer::Tick(time_t t)
{
- for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+ command_t* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS");
+ if (whowas_command)
{
- whowas_set* n = (whowas_set*)iter->second;
- if (n->size())
- {
- while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
- {
- WhoWasGroup *a = *(n->begin());
- DELETE(a);
- n->erase(n->begin());
- }
- }
+ std::deque<classbase*> params;
+ whowas_command->HandleInternal(WHOWAS_MAINTAIN, params);
}
+
timer = new MaintainTimer(ServerInstance, 3600);
ServerInstance->Timers->AddTimer(timer);
}