|
|||
|
|||
|
00001 /* +------------------------------------+ 00002 * | Inspire Internet Relay Chat Daemon | 00003 * +------------------------------------+ 00004 * 00005 * InspIRCd: (C) 2002-2008 InspIRCd Development Team 00006 * See: http://www.inspircd.org/wiki/index.php/Credits 00007 * 00008 * This program is free but copyrighted software; see 00009 * the file COPYING for details. 00010 * 00011 * --------------------------------------------------- 00012 */ 00013 00014 /* $Core */ 00015 00016 #include "inspircd.h" 00017 #include "timer.h" 00018 00019 TimerManager::TimerManager(InspIRCd* Instance) : ServerInstance(Instance) 00020 { 00021 } 00022 00023 void TimerManager::TickTimers(time_t TIME) 00024 { 00025 while ((Timers.size()) && (TIME > (*Timers.begin())->GetTimer())) 00026 { 00027 std::vector<Timer *>::iterator i = Timers.begin(); 00028 Timer *t = (*i); 00029 00030 // Probable fix: move vector manipulation to *before* we modify the vector. 00031 Timers.erase(i); 00032 00033 t->Tick(TIME); 00034 if (t->GetRepeat()) 00035 { 00036 t->SetTimer(TIME + t->GetSecs()); 00037 AddTimer(t); 00038 } 00039 else 00040 delete t; 00041 } 00042 } 00043 00044 void TimerManager::DelTimer(Timer* T) 00045 { 00046 std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T); 00047 00048 if (i != Timers.end()) 00049 { 00050 delete (*i); 00051 Timers.erase(i); 00052 } 00053 } 00054 00055 void TimerManager::AddTimer(Timer* T) 00056 { 00057 Timers.push_back(T); 00058 sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison); 00059 } 00060 00061 bool TimerManager::TimerComparison( Timer *one, Timer *two) 00062 { 00063 return (one->GetTimer()) < (two->GetTimer()); 00064 } 00065 00066