diff options
| author | Adam <Adam@anope.org> | 2013-02-13 17:42:01 -0500 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2013-02-14 01:20:18 -0500 |
| commit | 9e544a6443117861c3d6406e435043f1cf0f7099 (patch) | |
| tree | e7449fb01e377576e8a09f386117d2c251de0596 /src | |
| parent | 225b7c38c127fbc6aac6724012f71c9483a4da77 (diff) | |
Store what channels have references to accounts in NickCore to prevent having to iterate over all channels and then all access entries when nicks expire or from nickserv/alist
Diffstat (limited to 'src')
| -rw-r--r-- | src/access.cpp | 4 | ||||
| -rw-r--r-- | src/nickcore.cpp | 24 | ||||
| -rw-r--r-- | src/regchannel.cpp | 45 |
3 files changed, 61 insertions, 12 deletions
diff --git a/src/access.cpp b/src/access.cpp index fdaada75b..dd5881108 100644 --- a/src/access.cpp +++ b/src/access.cpp @@ -102,6 +102,10 @@ ChanAccess::~ChanAccess() std::vector<ChanAccess *>::iterator it = std::find(this->ci->access->begin(), this->ci->access->end(), this); if (it != this->ci->access->end()) this->ci->access->erase(it); + + const NickAlias *na = NickAlias::Find(this->mask); + if (na != NULL) + na->nc->RemoveChannelReference(this->ci); } } diff --git a/src/nickcore.cpp b/src/nickcore.cpp index 7dda6da5c..f92d4739c 100644 --- a/src/nickcore.cpp +++ b/src/nickcore.cpp @@ -17,7 +17,7 @@ Serialize::Checker<nickcore_map> NickCoreList("NickCore"); -NickCore::NickCore(const Anope::string &coredisplay) : Serializable("NickCore"), aliases("NickAlias") +NickCore::NickCore(const Anope::string &coredisplay) : Serializable("NickCore"), chanaccess("ChannelInfo"), aliases("NickAlias") { if (coredisplay.empty()) throw CoreException("Empty display passed to NickCore constructor"); @@ -44,6 +44,9 @@ NickCore::~NickCore() { FOREACH_MOD(I_OnDelCore, OnDelCore(this)); + if (!this->chanaccess->empty()) + Log(LOG_DEBUG) << "Non-empty chanaccess list in destructor!"; + for (std::list<User *>::iterator it = this->users.begin(); it != this->users.end();) { User *user = *it++; @@ -253,6 +256,25 @@ void NickCore::ClearCert() this->cert.clear(); } +void NickCore::AddChannelReference(ChannelInfo *ci) +{ + ++(*this->chanaccess)[ci]; +} + +void NickCore::RemoveChannelReference(ChannelInfo *ci) +{ + int& i = (*this->chanaccess)[ci]; + if (--i <= 0) + this->chanaccess->erase(ci); +} + +void NickCore::GetChannelReferences(std::deque<ChannelInfo *> &queue) +{ + queue.clear(); + for (std::map<ChannelInfo *, int>::iterator it = this->chanaccess->begin(), it_end = this->chanaccess->end(); it != it_end; ++it) + queue.push_back(it->first); +} + NickCore* NickCore::Find(const Anope::string &nick) { nickcore_map::const_iterator it = NickCoreList->find(nick); diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 257eca0ee..2a82590e2 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -82,6 +82,10 @@ AutoKick::~AutoKick() std::vector<AutoKick *>::iterator it = std::find(this->ci->akick->begin(), this->ci->akick->end(), this); if (it != this->ci->akick->end()) this->ci->akick->erase(it); + + const NickAlias *na = NickAlias::Find(this->mask); + if (na != NULL) + na->nc->RemoveChannelReference(this->ci); } } @@ -444,16 +448,9 @@ Serializable* ChannelInfo::Unserialize(Serializable *obj, Serialize::Data &data) ci->ExtensibleUnserialize(data); - if (ci->founder) - --ci->founder->channelcount; - ci->founder = NickCore::Find(sfounder); - if (ci->founder) - ++ci->founder->channelcount; + ci->SetFounder(NickCore::Find(sfounder)); + ci->SetSuccessor(NickCore::Find(ssuccessor)); - ci->successor = NickCore::Find(ssuccessor); - if (ci->founder && *ci->founder == *ci->successor) - ci->successor = NULL; - data["description"] >> ci->desc; data["time_registered"] >> ci->time_registered; data["last_used"] >> ci->last_used; @@ -511,12 +508,18 @@ Serializable* ChannelInfo::Unserialize(Serializable *obj, Serialize::Data &data) void ChannelInfo::SetFounder(NickCore *nc) { if (this->founder) + { --this->founder->channelcount; + this->founder->RemoveChannelReference(this); + } + this->founder = nc; + if (this->founder) + { ++this->founder->channelcount; - if (*this->founder == *this->successor) - this->successor = NULL; + this->founder->AddChannelReference(this); + } } NickCore *ChannelInfo::GetFounder() const @@ -524,6 +527,20 @@ NickCore *ChannelInfo::GetFounder() const return this->founder; } +void ChannelInfo::SetSuccessor(NickCore *nc) +{ + if (this->successor) + this->successor->RemoveChannelReference(this); + this->successor = nc; + if (this->successor) + this->successor->AddChannelReference(this); +} + +NickCore *ChannelInfo::GetSuccessor() const +{ + return this->successor; +} + BotInfo *ChannelInfo::WhoSends() const { if (this && this->bi) @@ -538,6 +555,10 @@ BotInfo *ChannelInfo::WhoSends() const void ChannelInfo::AddAccess(ChanAccess *taccess) { this->access->push_back(taccess); + + const NickAlias *na = NickAlias::Find(taccess->mask); + if (na != NULL) + na->nc->AddChannelReference(this); } ChanAccess *ChannelInfo::GetAccess(unsigned index) const @@ -639,6 +660,8 @@ AutoKick *ChannelInfo::AddAkick(const Anope::string &user, NickCore *akicknc, co this->akick->push_back(autokick); + akicknc->AddChannelReference(this); + return autokick; } |
