diff options
author | peavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-01-08 04:07:04 +0000 |
---|---|---|
committer | peavey <peavey@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-01-08 04:07:04 +0000 |
commit | 9f13269062094853b023d09b4ac24d2cf08a0de2 (patch) | |
tree | bae6c4deeac0635edcea147ab728df74da32f5c9 | |
parent | bf3acfa61d702eef0303bc4743592669cebebabf (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
-rw-r--r-- | include/commands/cmd_whowas.h | 67 | ||||
-rw-r--r-- | src/cmd_whowas.cpp | 44 |
2 files changed, 65 insertions, 46 deletions
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h index 1181b7ae8..90264b406 100644 --- a/include/commands/cmd_whowas.h +++ b/include/commands/cmd_whowas.h @@ -23,16 +23,50 @@ #include "users.h" #include "channels.h" +/* list of available internal commands */ +enum Internals +{ + WHOWAS_ADD = 1, + WHOWAS_STATS = 2, + WHOWAS_PRUNE = 3, + WHOWAS_MAINTAIN = 4 +}; + +/* Forward ref for timer */ class MaintainTimer; +/* Forward ref for typedefs */ +class WhoWasGroup; + /** InspTimer that is used to maintain the whowas list, called once an hour */ MaintainTimer* timer; +/** A group of users related by nickname + */ +typedef std::deque<WhoWasGroup*> whowas_set; + +/** Sets of users in the whowas system + */ +typedef std::map<irc::string,whowas_set*> whowas_users; + +/** Sets of time and users in whowas list + */ +typedef std::deque<std::pair<time_t,irc::string> > whowas_users_fifo; + /** Handle /WHOWAS */ class cmd_whowas : public command_t { + private: + /** Whowas container, contains a map of vectors of users tracked by WHOWAS + */ + whowas_users whowas; + + /** Whowas container, contains a map of time_t to users tracked by WHOWAS + */ + whowas_users_fifo whowas_fifo; + public: cmd_whowas(InspIRCd* Instance); CmdResult Handle(const char** parameters, int pcnt, userrec *user); @@ -40,17 +74,10 @@ class cmd_whowas : public command_t void AddToWhoWas(userrec* user); void GetStats(Extensible* ext); void PruneWhoWas(time_t t); + void MaintainWhoWas(time_t t); virtual ~cmd_whowas(); }; -enum Internals -{ - WHOWAS_ADD = 1, - WHOWAS_STATS = 2, - WHOWAS_PRUNE = 3 -}; - - /** Used to hold WHOWAS information */ class WhoWasGroup : public classbase @@ -95,28 +122,4 @@ class MaintainTimer : public InspTimer virtual void Tick(time_t TIME); }; -/** A group of users related by nickname - */ -typedef std::deque<WhoWasGroup*> whowas_set; - -/** Sets of users in the whowas system - */ -typedef std::map<irc::string,whowas_set*> whowas_users; - -/** Sets of time and users in whowas list - */ -typedef std::deque<std::pair<time_t,irc::string> > whowas_users_fifo; - -/** Called every hour by the core to remove expired entries - */ -void MaintainWhoWas(InspIRCd* ServerInstance, time_t TIME); - -/** Whowas container, contains a map of vectors of users tracked by WHOWAS - */ -whowas_users whowas; - -/** Whowas container, contains a map of time_t to users tracked by WHOWAS - */ -whowas_users_fifo whowas_fifo; - #endif 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*> ¶meters) { @@ -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); } |