1
0
mirror of https://github.com/anope/anope.git synced 2026-07-07 12:23:13 +02:00

Merge usefulness of Timer and CallBack classes into Timer, and fix it to really work

This commit is contained in:
Adam
2013-03-30 23:38:40 -05:00
parent 111d6a9178
commit 7e7556f064
14 changed files with 71 additions and 61 deletions
-22
View File
@@ -195,10 +195,6 @@ class CoreExport Module : public Extensible
*/
Anope::string filename;
/** Callbacks used in this module
*/
std::list<CallBack *> callbacks;
/** Handle for this module, obtained from dlopen()
*/
void *handle;
@@ -1126,11 +1122,6 @@ class CoreExport ModuleManager
*/
static void Attach(Implementation *i, Module *mod, size_t sz);
/** Delete all callbacks attached to a module
* @param m The module
*/
static void ClearCallBacks(Module *m);
/** Unloading all modules except the protocol module.
*/
static void UnloadAll();
@@ -1143,17 +1134,4 @@ class CoreExport ModuleManager
static ModuleReturn DeleteModule(Module *m);
};
/** Class used for callbacks within modules. These are identical to Timers hwoever
* they will be cleaned up automatically when a module is unloaded, and Timers will not.
*/
class CoreExport CallBack : public Timer
{
private:
Module *m;
public:
CallBack(Module *mod, long time_from_now, time_t now = Anope::CurTime, bool repeating = false);
virtual ~CallBack();
};
#endif // MODULES_H
+21
View File
@@ -18,6 +18,10 @@
class CoreExport Timer
{
private:
/** The owner of the timer, if any
*/
Module *owner;
/** The time this was created
*/
time_t settime;
@@ -42,6 +46,14 @@ class CoreExport Timer
*/
Timer(long time_from_now, time_t now = Anope::CurTime, bool repeating = false);
/** Constructor, initializes the triggering time
* @param creator The creator of the timer
* @param time_from_now The number of seconds from now to trigger the timer
* @param now The time now
* @param repeating Repeat this timer every time_from_now if this is true
*/
Timer(Module *creator, long time_from_now, time_t now = Anope::CurTime, bool repeating = false);
/** Destructor, removes the timer from the list
*/
virtual ~Timer();
@@ -76,6 +88,11 @@ class CoreExport Timer
*/
time_t GetSetTime() const;
/** Returns the owner of this timer, if any
* @return The owner of the timer
*/
Module *GetOwner() const;
/** Called when the timer ticks
* This should be overridden with something useful
*/
@@ -106,6 +123,10 @@ class CoreExport TimerManager
* @param ctime The current time
*/
static void TickTimers(time_t ctime = Anope::CurTime);
/** Deletes all timers owned by the given module
*/
static void DeleteTimersFor(Module *m);
};
#endif // TIMERS_H
+2 -2
View File
@@ -680,10 +680,10 @@ struct UserData : ExtensibleItem
};
class BanDataPurger : public CallBack
class BanDataPurger : public Timer
{
public:
BanDataPurger(Module *owner) : CallBack(owner, 300, Anope::CurTime, true) { }
BanDataPurger(Module *o) : Timer(o, 300, Anope::CurTime, true) { }
void Tick(time_t) anope_override
{
+4 -4
View File
@@ -57,15 +57,15 @@ class CommandBSSet : public Command
class CommandBSSetBanExpire : public Command
{
public:
class Timer : public CallBack
class UnbanTimer : public Timer
{
Anope::string chname;
Anope::string mask;
public:
Timer(Module *creator, const Anope::string &ch, const Anope::string &bmask, time_t t) : CallBack(creator, t), chname(ch), mask(bmask) { }
UnbanTimer(Module *creator, const Anope::string &ch, const Anope::string &bmask, time_t t) : Timer(creator, t), chname(ch), mask(bmask) { }
void Tick(time_t)
void Tick(time_t) anope_override
{
Channel *c = Channel::Find(chname);
if (c)
@@ -504,7 +504,7 @@ class BSSet : public Module
if (!ci->banexpire)
return;
new CommandBSSetBanExpire::Timer(this, ci->name, mask, ci->banexpire);
new CommandBSSetBanExpire::UnbanTimer(this, ci->name, mask, ci->banexpire);
}
};
+2 -2
View File
@@ -15,14 +15,14 @@
static Module *me;
class TempBan : public CallBack
class TempBan : public Timer
{
private:
Anope::string channel;
Anope::string mask;
public:
TempBan(time_t seconds, Channel *c, const Anope::string &banmask) : CallBack(me, seconds), channel(c->name), mask(banmask) { }
TempBan(time_t seconds, Channel *c, const Anope::string &banmask) : Timer(me, seconds), channel(c->name), mask(banmask) { }
void Tick(time_t ctime) anope_override
{
+2 -2
View File
@@ -293,10 +293,10 @@ class CommandSeen : public Command
}
};
class DataBasePurger : public CallBack
class DataBasePurger : public Timer
{
public:
DataBasePurger(Module *owner) : CallBack(owner, 300, Anope::CurTime, true) { }
DataBasePurger(Module *o) : Timer(o, 300, Anope::CurTime, true) { }
void Tick(time_t) anope_override
{
+2 -2
View File
@@ -104,12 +104,12 @@ static ServiceReference<GlobalService> GlobalService("GlobalService", "Global");
static Timer *timeout;
class DefConTimeout : public CallBack
class DefConTimeout : public Timer
{
int level;
public:
DefConTimeout(Module *mod, int newlevel) : CallBack(mod, DConfig.timeout), level(newlevel)
DefConTimeout(Module *mod, int newlevel) : Timer(mod, DConfig.timeout), level(newlevel)
{
timeout = this;
}
+2 -2
View File
@@ -279,14 +279,14 @@ class MyHTTPClient : public HTTPClient
}
};
class MyHTTPProvider : public HTTPProvider, public CallBack
class MyHTTPProvider : public HTTPProvider, public Timer
{
int timeout;
std::map<Anope::string, HTTPPage *> pages;
std::list<Reference<MyHTTPClient> > clients;
public:
MyHTTPProvider(Module *c, const Anope::string &n, const Anope::string &i, const unsigned short p, const int t) : Socket(-1, i.find(':') != Anope::string::npos), HTTPProvider(c, n, i, p), CallBack(c, 10, Anope::CurTime, true), timeout(t) { }
MyHTTPProvider(Module *c, const Anope::string &n, const Anope::string &i, const unsigned short p, const int t) : Socket(-1, i.find(':') != Anope::string::npos), HTTPProvider(c, n, i, p), Timer(c, 10, Anope::CurTime, true), timeout(t) { }
void Tick(time_t) anope_override
{
+2 -2
View File
@@ -201,10 +201,10 @@ class ModuleProxyScan : public Module
ProxyCallbackListener *listener;
class ConnectionTimeout : public CallBack
class ConnectionTimeout : public Timer
{
public:
ConnectionTimeout(Module *creator, long timeout) : CallBack(creator, timeout, Anope::CurTime, true)
ConnectionTimeout(Module *c, long timeout) : Timer(c, timeout, Anope::CurTime, true)
{
}
+2 -2
View File
@@ -13,10 +13,10 @@
#include "module.h"
class ExpireCallback : public CallBack
class ExpireCallback : public Timer
{
public:
ExpireCallback(Module *owner) : CallBack(owner, Config->ExpireTimeout, Anope::CurTime, true) { }
ExpireCallback(Module *o) : Timer(o, Config->ExpireTimeout, Anope::CurTime, true) { }
void Tick(time_t) anope_override
{
+2 -2
View File
@@ -139,10 +139,10 @@ class MyNickServService : public NickServService
}
};
class ExpireCallback : public CallBack
class ExpireCallback : public Timer
{
public:
ExpireCallback(Module *owner) : CallBack(owner, Config->ExpireTimeout, Anope::CurTime, true) { }
ExpireCallback(Module *o) : Timer(o, Config->ExpireTimeout, Anope::CurTime, true) { }
void Tick(time_t) anope_override
{
+2 -13
View File
@@ -57,9 +57,9 @@ Module::~Module()
{
/* Detach all event hooks for this module */
ModuleManager::DetachAll(this);
/* Clear any active callbacks this module has */
ModuleManager::ClearCallBacks(this);
IdentifyRequest::ModuleUnload(this);
/* Clear any active timers this module has */
TimerManager::DeleteTimersFor(this);
std::list<Module *>::iterator it = std::find(ModuleManager::Modules.begin(), ModuleManager::Modules.end(), this);
if (it != ModuleManager::Modules.end())
@@ -111,14 +111,3 @@ int ModuleVersion::GetPatch() const
return this->version_patch;
}
CallBack::CallBack(Module *mod, long time_from_now, time_t now, bool repeating) : Timer(time_from_now, now, repeating), m(mod)
{
}
CallBack::~CallBack()
{
std::list<CallBack *>::iterator it = std::find(m->callbacks.begin(), m->callbacks.end(), this);
if (it != m->callbacks.end())
m->callbacks.erase(it);
}
-6
View File
@@ -449,12 +449,6 @@ bool ModuleManager::SetPriority(Module *mod, Implementation i, Priority s, Modul
return true;
}
void ModuleManager::ClearCallBacks(Module *m)
{
while (!m->callbacks.empty())
delete m->callbacks.front();
}
void ModuleManager::UnloadAll()
{
std::vector<Anope::string> modules[MT_END];
+28
View File
@@ -14,6 +14,18 @@ std::multimap<time_t, Timer *> TimerManager::Timers;
Timer::Timer(long time_from_now, time_t now, bool repeating)
{
owner = NULL;
trigger = now + time_from_now;
secs = time_from_now;
repeat = repeating;
settime = now;
TimerManager::AddTimer(this);
}
Timer::Timer(Module *creator, long time_from_now, time_t now, bool repeating)
{
owner = creator;
trigger = now + time_from_now;
secs = time_from_now;
repeat = repeating;
@@ -62,6 +74,11 @@ long Timer::GetSecs() const
return secs;
}
Module *Timer::GetOwner() const
{
return owner;
}
void TimerManager::AddTimer(Timer *t)
{
Timers.insert(std::make_pair(t->GetTimer(), t));
@@ -98,3 +115,14 @@ void TimerManager::TickTimers(time_t ctime)
delete t;
}
}
void TimerManager::DeleteTimersFor(Module *m)
{
for (std::multimap<time_t, Timer *>::iterator it = Timers.begin(), it_next = it; it != Timers.end(); it = it_next)
{
++it_next;
if (it->second->GetOwner() == m)
delete it->second;
}
}