The InspIRCd Project
Home | Developers | Wiki | Forums | Bug Tracker | SVN | Download
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

timer.cpp

Go to the documentation of this file.
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