summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-10-02 22:19:19 +0000
committerAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-10-02 22:19:19 +0000
commitdc4b9afebbea5c8ca2d5b86c84411153b1622f71 (patch)
tree92ca6661ccceea15a215e77f3879b4c036ada67c /src
parent85b409df8577e2433724a056564ab62ff72c4c89 (diff)
Properly remove old callbacks from modules internal list of callbacks list, and cleaned up some of the timers code
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2524 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src')
-rw-r--r--src/modulemanager.cpp6
-rw-r--r--src/modules.c29
-rw-r--r--src/timers.cpp25
3 files changed, 38 insertions, 22 deletions
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
index efbb6db83..e0fada619 100644
--- a/src/modulemanager.cpp
+++ b/src/modulemanager.cpp
@@ -479,14 +479,10 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, Priority s, Modul
void ModuleManager::ClearTimers(Module *m)
{
std::list<Timer *>::iterator it;
- Timer *t2;
for (it = m->CallBacks.begin(); it != m->CallBacks.end(); ++it)
{
- t2 = *it;
-
- TimerManager::DelTimer(t2);
+ TimerManager::DelTimer(*it);
}
-
m->CallBacks.clear();
}
diff --git a/src/modules.c b/src/modules.c
index e33bc863a..b7af6acf5 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -625,6 +625,19 @@ int destroyMessage(Message * m)
*/
void Module::AddCallBack(Timer *t)
{
+ /* Remove no longer valid Timers from the modules internal list */
+ std::list<Timer *>::iterator it, it2;
+ for (it = this->CallBacks.begin(); it != this->CallBacks.end(); it = it2)
+ {
+ it2 = it;
+ ++it2;
+
+ if (!TimerManager::IsTimer(*it))
+ {
+ this->CallBacks.erase(it);
+ }
+ }
+
this->CallBacks.push_back(t);
}
@@ -634,19 +647,13 @@ void Module::AddCallBack(Timer *t)
*/
bool Module::DelCallBack(Timer *t)
{
- std::list<Timer *>::iterator it;
- Timer *t2;
+ std::list<Timer *>::iterator it = std::find(this->CallBacks.begin(), this->CallBacks.end(), t);
- for (it = this->CallBacks.begin(); it != this->CallBacks.end(); ++it)
+ if (it != this->CallBacks.end())
{
- t2 = *it;
-
- if (t == t2)
- {
- TimerManager::DelTimer(t2);
- this->CallBacks.erase(it);
- return true;
- }
+ TimerManager::DelTimer(*it);
+ this->CallBacks.erase(it);
+ return true;
}
return false;
diff --git a/src/timers.cpp b/src/timers.cpp
index 02e5a3f08..d7c56072b 100644
--- a/src/timers.cpp
+++ b/src/timers.cpp
@@ -99,8 +99,24 @@ void TimerManager::DelTimer(Timer *T)
}
}
+/** Check if something is a timer
+ * @param T A pointer
+ * @return true or false
+ */
+bool TimerManager::IsTimer(Timer *T)
+{
+ std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T);
+
+ if (i != Timers.end())
+ {
+ return true;
+ }
+
+ return false;
+}
+
/** Tick all pending timers
- * @param time The current time
+ * @param ctime The current time
*/
void TimerManager::TickTimers(time_t ctime)
{
@@ -110,20 +126,17 @@ void TimerManager::TickTimers(time_t ctime)
while ((Timers.size()) && (ctime > (*Timers.begin())->GetTimer()))
{
i = Timers.begin();
-
t = *i;
t->Tick(ctime);
- Timers.erase(i);
-
if (t->GetRepeat())
{
t->SetTimer(ctime + t->GetSecs());
- AddTimer(t);
+ sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison);
}
else
- delete t;
+ TimerManager::DelTimer(t);
}
}