anope

- supernets anope source code & configuration
git clone git://git.acid.vegas/anope.git
Log | Files | Refs | Archive | README

timers.cpp (2212B)

      1 /* Timer stuff.
      2  *
      3  * (C) 2003-2022 Anope Team
      4  * Contact us at team@anope.org
      5  *
      6  * Please read COPYING and README for further details.
      7  */
      8 
      9 #include "services.h"
     10 #include "timers.h"
     11 
     12 std::multimap<time_t, Timer *> TimerManager::Timers;
     13 
     14 Timer::Timer(long time_from_now, time_t now, bool repeating)
     15 {
     16 	owner = NULL;
     17 	trigger = now + time_from_now;
     18 	secs = time_from_now;
     19 	repeat = repeating;
     20 	settime = now;
     21 
     22 	TimerManager::AddTimer(this);
     23 }
     24 
     25 Timer::Timer(Module *creator, long time_from_now, time_t now, bool repeating)
     26 {
     27 	owner = creator;
     28 	trigger = now + time_from_now;
     29 	secs = time_from_now;
     30 	repeat = repeating;
     31 	settime = now;
     32 
     33 	TimerManager::AddTimer(this);
     34 }
     35 
     36 Timer::~Timer()
     37 {
     38 	TimerManager::DelTimer(this);
     39 }
     40 
     41 void Timer::SetTimer(time_t t)
     42 {
     43 	TimerManager::DelTimer(this);
     44 	trigger = t;
     45 	TimerManager::AddTimer(this);
     46 }
     47 
     48 time_t Timer::GetTimer() const
     49 {
     50 	return trigger;
     51 }
     52 
     53 bool Timer::GetRepeat() const
     54 {
     55 	return repeat;
     56 }
     57 
     58 time_t Timer::GetSetTime() const
     59 {
     60 	return settime;
     61 }
     62 
     63 void Timer::SetSecs(time_t t)
     64 {
     65 	TimerManager::DelTimer(this);
     66 	secs = t;
     67 	trigger = Anope::CurTime + t;
     68 	TimerManager::AddTimer(this);
     69 }
     70 
     71 long Timer::GetSecs() const
     72 {
     73 	return secs;
     74 }
     75 
     76 Module *Timer::GetOwner() const
     77 {
     78 	return owner;
     79 }
     80 
     81 void TimerManager::AddTimer(Timer *t)
     82 {
     83 	Timers.insert(std::make_pair(t->GetTimer(), t));
     84 }
     85 
     86 void TimerManager::DelTimer(Timer *t)
     87 {
     88 	std::pair<std::multimap<time_t, Timer *>::iterator, std::multimap<time_t, Timer *>::iterator> itpair = Timers.equal_range(t->GetTimer());
     89 	for (std::multimap<time_t, Timer *>::iterator i = itpair.first; i != itpair.second; ++i)
     90 	{
     91 		if (i->second == t)
     92 		{
     93 			Timers.erase(i);
     94 			break;
     95 		}
     96 	}
     97 }
     98 
     99 void TimerManager::TickTimers(time_t ctime)
    100 {
    101 	while (!Timers.empty())
    102 	{
    103 		std::multimap<time_t, Timer *>::iterator it = Timers.begin();
    104 		Timer *t = it->second;
    105 
    106 		if (t->GetTimer() > ctime)
    107 			break;
    108 
    109 		t->Tick(ctime);
    110 
    111 		if (t->GetRepeat())
    112 			t->SetTimer(ctime + t->GetSecs());
    113 		else
    114 			delete t;
    115 	}
    116 }
    117 
    118 void TimerManager::DeleteTimersFor(Module *m)
    119 {
    120 	for (std::multimap<time_t, Timer *>::iterator it = Timers.begin(), it_next = it; it != Timers.end(); it = it_next)
    121 	{
    122 		++it_next;
    123 		if (it->second->GetOwner() == m)
    124 			delete it->second;
    125 	}
    126 }