Blame src/Timer.cc

Packit 8f70b4
/*
Packit 8f70b4
 * lftp - file transfer program
Packit 8f70b4
 *
Packit 8f70b4
 * Copyright (c) 1996-2013 by Alexander V. Lukyanov (lav@yars.free.net)
Packit 8f70b4
 *
Packit 8f70b4
 * This program is free software; you can redistribute it and/or modify
Packit 8f70b4
 * it under the terms of the GNU General Public License as published by
Packit 8f70b4
 * the Free Software Foundation; either version 3 of the License, or
Packit 8f70b4
 * (at your option) any later version.
Packit 8f70b4
 *
Packit 8f70b4
 * This program is distributed in the hope that it will be useful,
Packit 8f70b4
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8f70b4
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8f70b4
 * GNU General Public License for more details.
Packit 8f70b4
 *
Packit 8f70b4
 * You should have received a copy of the GNU General Public License
Packit 8f70b4
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 8f70b4
 */
Packit 8f70b4
Packit 8f70b4
#include <config.h>
Packit 8f70b4
#include "SMTask.h"
Packit 8f70b4
#include "Timer.h"
Packit 8f70b4
#include "xstring.h"
Packit 8f70b4
#include "misc.h"
Packit 8f70b4
Packit 8f70b4
#define now SMTask::now
Packit 8f70b4
Packit 8f70b4
xlist_head<Timer> Timer::all_timers;
Packit 8f70b4
xheap<Timer> Timer::running_timers;
Packit 8f70b4
int Timer::infty_count;
Packit 8f70b4
Packit 8f70b4
timeval Timer::GetTimeoutTV()
Packit 8f70b4
{
Packit 8f70b4
   Timer *t;
Packit 8f70b4
   while((t=running_timers.get_min())!=0 && t->Stopped())
Packit 8f70b4
      running_timers.pop_min();
Packit 8f70b4
   if(!t) {
Packit 8f70b4
      timeval tv={infty_count?HOUR:-1, 0};
Packit 8f70b4
      return tv;
Packit 8f70b4
   }
Packit 8f70b4
   TimeDiff remains(t->stop,now);
Packit 8f70b4
   return remains.toTimeval();
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
TimeInterval Timer::TimeLeft() const
Packit 8f70b4
{
Packit 8f70b4
   if(IsInfty())
Packit 8f70b4
      return TimeInterval();
Packit 8f70b4
   if(now>=stop)
Packit 8f70b4
      return TimeInterval(0,0);
Packit 8f70b4
   return TimeInterval(stop-now);
Packit 8f70b4
}
Packit 8f70b4
void Timer::set_last_setting(const TimeInterval &i)
Packit 8f70b4
{
Packit 8f70b4
   infty_count-=IsInfty();
Packit 8f70b4
   last_setting=i;
Packit 8f70b4
   infty_count+=IsInfty();
Packit 8f70b4
   re_set();
Packit 8f70b4
}
Packit 8f70b4
void Timer::add_random()
Packit 8f70b4
{
Packit 8f70b4
   if(random_max>0.0001) {
Packit 8f70b4
      stop+=TimeDiff::valueOf(random_max*random01());
Packit 8f70b4
   }
Packit 8f70b4
}
Packit 8f70b4
void Timer::re_set()
Packit 8f70b4
{
Packit 8f70b4
   stop=start;
Packit 8f70b4
   stop+=last_setting;
Packit 8f70b4
   add_random();
Packit 8f70b4
   re_sort();
Packit 8f70b4
}
Packit 8f70b4
void Timer::AddRandom(double r) {
Packit 8f70b4
   random_max=r;
Packit 8f70b4
   add_random();
Packit 8f70b4
   re_sort();
Packit 8f70b4
}
Packit 8f70b4
void Timer::Set(const TimeInterval &i)
Packit 8f70b4
{
Packit 8f70b4
   resource.unset();
Packit 8f70b4
   closure.unset();
Packit 8f70b4
   start=SMTask::now;
Packit 8f70b4
   set_last_setting(i);
Packit 8f70b4
}
Packit 8f70b4
void Timer::Reset(const Time &t)
Packit 8f70b4
{
Packit 8f70b4
   if(start>=t && stop>t)
Packit 8f70b4
      return;
Packit 8f70b4
   start=t;
Packit 8f70b4
   re_set();
Packit 8f70b4
}
Packit 8f70b4
void Timer::ResetDelayed(int s)
Packit 8f70b4
{
Packit 8f70b4
   Reset(SMTask::now+TimeDiff(s,0));
Packit 8f70b4
}
Packit 8f70b4
void Timer::StopDelayed(int s)
Packit 8f70b4
{
Packit 8f70b4
   stop=SMTask::now+TimeDiff(s,0);
Packit 8f70b4
   re_sort();
Packit 8f70b4
}
Packit 8f70b4
void Timer::SetResource(const char *r,const char *c)
Packit 8f70b4
{
Packit 8f70b4
   if(resource!=r || closure!=c)
Packit 8f70b4
   {
Packit 8f70b4
      resource.set(r);
Packit 8f70b4
      closure.set(c);
Packit 8f70b4
      start=now;
Packit 8f70b4
      reconfig(r);
Packit 8f70b4
   }
Packit 8f70b4
   else
Packit 8f70b4
   {
Packit 8f70b4
      Reset();
Packit 8f70b4
   }
Packit 8f70b4
}
Packit 8f70b4
bool Timer::Stopped() const
Packit 8f70b4
{
Packit 8f70b4
   if(IsInfty())
Packit 8f70b4
      return false;
Packit 8f70b4
   return now>=stop;
Packit 8f70b4
}
Packit 8f70b4
void Timer::reconfig(const char *r)
Packit 8f70b4
{
Packit 8f70b4
   if(resource && (!r || !strcmp(r,resource)))
Packit 8f70b4
      set_last_setting(TimeIntervalR(ResMgr::Query(resource,closure)));
Packit 8f70b4
}
Packit 8f70b4
void Timer::init()
Packit 8f70b4
{
Packit 8f70b4
   random_max=0;
Packit 8f70b4
   all_timers.add(all_timers_node);
Packit 8f70b4
}
Packit 8f70b4
Timer::~Timer()
Packit 8f70b4
{
Packit 8f70b4
   running_timers.remove(running_timers_node);
Packit 8f70b4
   all_timers_node.remove();
Packit 8f70b4
   infty_count-=IsInfty();
Packit 8f70b4
}
Packit 8f70b4
Timer::Timer() : last_setting(1,0),
Packit 8f70b4
   all_timers_node(this), running_timers_node(this)
Packit 8f70b4
{
Packit 8f70b4
   init();
Packit 8f70b4
}
Packit 8f70b4
Timer::Timer(const TimeInterval &d) : last_setting(d),
Packit 8f70b4
   all_timers_node(this), running_timers_node(this)
Packit 8f70b4
{
Packit 8f70b4
   init();
Packit 8f70b4
   infty_count+=IsInfty();
Packit 8f70b4
   re_set();
Packit 8f70b4
}
Packit 8f70b4
Timer::Timer(const char *r,const char *c) : last_setting(0,0),
Packit 8f70b4
   all_timers_node(this), running_timers_node(this)
Packit 8f70b4
{
Packit 8f70b4
   init();
Packit 8f70b4
   resource.set(r);
Packit 8f70b4
   closure.set(c);
Packit 8f70b4
   start=now;
Packit 8f70b4
   reconfig(r);
Packit 8f70b4
}
Packit 8f70b4
Timer::Timer(int s,int ms) :
Packit 8f70b4
   all_timers_node(this), running_timers_node(this)
Packit 8f70b4
{
Packit 8f70b4
   init();
Packit 8f70b4
   Set(TimeInterval(s,ms));
Packit 8f70b4
}
Packit 8f70b4
void Timer::re_sort()
Packit 8f70b4
{
Packit 8f70b4
   running_timers.remove(running_timers_node);
Packit 8f70b4
   if(now
Packit 8f70b4
      running_timers.add(running_timers_node);
Packit 8f70b4
}
Packit 8f70b4
void Timer::ReconfigAll(const char *r)
Packit 8f70b4
{
Packit 8f70b4
   xlist_for_each(Timer,all_timers,node,scan)
Packit 8f70b4
      scan->reconfig(r);
Packit 8f70b4
}
Packit 8f70b4
Packit 8f70b4
bool operator<(const Timer& a,const Timer& b)
Packit 8f70b4
{
Packit 8f70b4
   return a.TimeLeft()
Packit 8f70b4
}