diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-09-30 21:55:21 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-09-30 21:55:21 +0000 |
commit | 3dc81ee1331d1b37ee85be9bf0d843e3b6827a2d (patch) | |
tree | 431e66fceef85d577d360865b3b878dc9132afc2 /src/users.cpp | |
parent | 7aa5e059a8f66d91bd8b69c58c657ceb70b4baff (diff) |
Add explicit reference-counting base class
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11785 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/users.cpp')
-rw-r--r-- | src/users.cpp | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/src/users.cpp b/src/users.cpp index f5eeff942..236df2d65 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -568,14 +568,14 @@ void User::OnError(BufferedSocketError) ServerInstance->Users->QuitUser(this, getError()); } -void User::cull() +bool User::cull() { if (!quitting) ServerInstance->Users->QuitUser(this, "Culled without QuitUser"); if (uuid.empty()) { ServerInstance->Logs->Log("USERS", DEBUG, "User culled twice? UUID empty"); - return; + return true; } PurgeEmptyChannels(); if (IS_LOCAL(this)) @@ -590,14 +590,6 @@ void User::cull() ServerInstance->Logs->Log("USERS", DEBUG, "Failed to remove user from vector"); } - if (this->MyClass) - { - this->MyClass->RefCount--; - ServerInstance->Logs->Log("USERS", DEBUG, "User destructor -- connect refcount now: %lu", this->MyClass->RefCount); - if (MyClass->RefCount == 0) - delete MyClass; - } - if (this->AllowedOperCommands) { delete AllowedOperCommands; @@ -618,6 +610,7 @@ void User::cull() ServerInstance->Users->uuidlist->erase(uuid); uuid.clear(); + return true; } void User::Oper(const std::string &opertype, const std::string &opername) @@ -1658,7 +1651,7 @@ ConnectClass* User::SetClass(const std::string &explicit_name) * deny change if change will take class over the limit check it HERE, not after we found a matching class, * because we should attempt to find another class if this one doesn't match us. -- w00t */ - if (c->limit && (c->RefCount >= c->limit)) + if (c->limit && (c->GetReferenceCount() >= c->limit)) { ServerInstance->Logs->Log("CONNECTCLASS", DEBUG, "OOPS: Connect class limit (%lu) hit, denying", c->limit); continue; @@ -1688,20 +1681,7 @@ ConnectClass* User::SetClass(const std::string &explicit_name) */ if (found) { - /* only fiddle with refcounts if they are already in a class .. */ - if (this->MyClass) - { - if (found == this->MyClass) // no point changing this shit :P - return this->MyClass; - this->MyClass->RefCount--; - ServerInstance->Logs->Log("USERS", DEBUG, "Untying user from connect class -- refcount: %lu", this->MyClass->RefCount); - if (MyClass->RefCount == 0) - delete MyClass; - } - - this->MyClass = found; - this->MyClass->RefCount++; - ServerInstance->Logs->Log("USERS", DEBUG, "User tied to new class -- connect refcount now: %lu", this->MyClass->RefCount); + MyClass = found; } return this->MyClass; @@ -1824,8 +1804,7 @@ const std::string FakeUser::GetFullRealHost() ConnectClass::ConnectClass(char t, const std::string& mask) : type(t), name("unnamed"), registration_timeout(0), host(mask), pingtime(0), pass(""), hash(""), softsendqmax(0), hardsendqmax(0), - recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), limit(0), - RefCount(1) + recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), limit(0) { } @@ -1836,7 +1815,7 @@ ConnectClass::ConnectClass(char t, const std::string& mask, const ConnectClass& softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax), maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxchans(parent.maxchans), - port(parent.port), limit(parent.limit), RefCount(1) + port(parent.port), limit(parent.limit) { } |