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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user