X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcull_list.cpp;h=00c9161994385789f354aa5f9d4904eae6e9685a;hb=84a19a9ab6129deb71cdc24b216b74dd8eb80978;hp=224a9e3da0b55fc9792aec1f314f54a570bcbc82;hpb=003fa072fcc5cb2349ceee6798efaaaa1e63d64f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/cull_list.cpp b/src/cull_list.cpp index 224a9e3da..00c916199 100644 --- a/src/cull_list.cpp +++ b/src/cull_list.cpp @@ -18,17 +18,7 @@ using namespace std; #include "inspircd_config.h" #include "inspircd.h" -#include "inspircd_io.h" -#include -#include -#include -#include #include -#ifdef GCC3 -#include -#else -#include -#endif #include #include #include @@ -52,6 +42,9 @@ using namespace std; extern InspIRCd* ServerInstance; extern user_hash clientlist; +/* + * In current implementation of CullList, this isn't used. It did odd things with a lot of sockets. + */ bool CullList::IsValid(userrec* user) { time_t esignon = 0; @@ -81,67 +74,67 @@ bool CullList::IsValid(userrec* user) return false; } -CullItem::CullItem(userrec* u, std::string r) +CullItem::CullItem(userrec* u, std::string &r) +{ + this->user = u; + this->reason = r; +} + +CullItem::CullItem(userrec* u, const char* r) +{ + this->user = u; + this->reason = r; +} + +CullItem::~CullItem() { - this->user = u; - this->reason = r; } userrec* CullItem::GetUser() { - return this->user; + return this->user; } -std::string CullItem::GetReason() +std::string& CullItem::GetReason() { - return this->reason; + return this->reason; } CullList::CullList() { list.clear(); - exempt.clear(); + exempt.clear(); } -void CullList::AddItem(userrec* user, std::string reason) +void CullList::AddItem(userrec* user, std::string &reason) { if (exempt.find(user) == exempt.end()) { - CullItem item(user,reason); - list.push_back(item); - exempt[user] = user->signon; + CullItem item(user,reason); + list.push_back(item); + exempt[user] = user->signon; + } +} + +void CullList::AddItem(userrec* user, const char* reason) +{ + if (exempt.find(user) == exempt.end()) + { + CullItem item(user,reason); + list.push_back(item); + exempt[user] = user->signon; } } int CullList::Apply() { - int n = 0; - while (list.size()) - { + int n = 0; + while (list.size()) + { std::vector::iterator a = list.begin(); - userrec* u = a->GetUser(); - /* Because ServerInstance->DoOneIteration can - * take the user away from us in the middle of - * our operation, we should check to see if this - * pointer is still valid by iterating the hash. - * It's expensive, yes, but the DoOneIteration - * call stops it being horrendously bad. - */ - if (IsValid(u)) - { - kill_link(u,a->GetReason().c_str()); - list.erase(list.begin()); - /* So that huge numbers of quits dont block, - * we yield back to our mainloop every 15 - * iterations. - * The DoOneIteration call basically acts - * like a software threading mechanism. - */ - if (((n++) % 15) == 0) - { - ServerInstance->DoOneIteration(false); - } - } - } - return n; + + kill_link(a->GetUser(), a->GetReason().c_str()); + list.erase(list.begin()); + } + return n; }