From 48f168fb1a6e45986d1a3a934282fd1baff4fa0d Mon Sep 17 00:00:00 2001 From: schodet Date: Sun, 6 Mar 2005 17:22:53 +0000 Subject: Utilisation de Timer, correction de bugs. --- 2005/i/robert/src/scheduler/Makefile.defs | 5 +++- 2005/i/robert/src/scheduler/schedulable.hh | 7 +++--- 2005/i/robert/src/scheduler/schedulable_alarm.cc | 2 +- 2005/i/robert/src/scheduler/schedulable_alarm.hh | 13 +++++++--- 2005/i/robert/src/scheduler/scheduler.cc | 31 +++++++++++++++--------- 2005/i/robert/src/scheduler/test_scheduler.cc | 10 ++++---- 6 files changed, 43 insertions(+), 25 deletions(-) (limited to '2005/i/robert/src/scheduler') diff --git a/2005/i/robert/src/scheduler/Makefile.defs b/2005/i/robert/src/scheduler/Makefile.defs index 73b5da9..9aff718 100644 --- a/2005/i/robert/src/scheduler/Makefile.defs +++ b/2005/i/robert/src/scheduler/Makefile.defs @@ -1,6 +1,9 @@ PROGRAMS += test_scheduler +scheduler_OBJECTS = scheduler.o schedulable_read_fd.o schedulable_alarm.o + test_scheduler_OBJECTS = \ - test_scheduler.o scheduler.o schedulable_read_fd.o schedulable_alarm.o + test_scheduler.o scheduler.o schedulable_read_fd.o schedulable_alarm.o \ + $(timer_OBJECTS) test_scheduler: $(test_scheduler_OBJECTS) diff --git a/2005/i/robert/src/scheduler/schedulable.hh b/2005/i/robert/src/scheduler/schedulable.hh index bfe6de3..d8869af 100644 --- a/2005/i/robert/src/scheduler/schedulable.hh +++ b/2005/i/robert/src/scheduler/schedulable.hh @@ -37,11 +37,12 @@ class Schedulable /// Destructeur. virtual ~Schedulable (void) {} /// Paramètre le Scheduler. - virtual void setup (Scheduler &scheduler, int time, FdSet &readSet, int &timeout) = - 0; + virtual void setup (Scheduler &scheduler, int time, FdSet &readSet, + int &timeout) = 0; /// Appelé aprés l'attente du Scheduler, renvois true si un événement a /// été traité. - virtual bool run (Scheduler &scheduler, int time, const FdSet &readSet) = 0; + virtual bool run (Scheduler &scheduler, int time, + const FdSet &readSet) = 0; }; } // namespace scheduler diff --git a/2005/i/robert/src/scheduler/schedulable_alarm.cc b/2005/i/robert/src/scheduler/schedulable_alarm.cc index c55832e..b890350 100644 --- a/2005/i/robert/src/scheduler/schedulable_alarm.cc +++ b/2005/i/robert/src/scheduler/schedulable_alarm.cc @@ -42,7 +42,7 @@ SchedulableAlarm::setup (Scheduler &scheduler, int time, FdSet &readSet, int bool SchedulableAlarm::run (Scheduler &scheduler, int time, const FdSet &readSet) { - if (time > start_ + step_) + if (time >= start_ + step_) { start_ = periodic_ ? start_ + step_ : -1; callback_ (); diff --git a/2005/i/robert/src/scheduler/schedulable_alarm.hh b/2005/i/robert/src/scheduler/schedulable_alarm.hh index f416d12..1e008b6 100644 --- a/2005/i/robert/src/scheduler/schedulable_alarm.hh +++ b/2005/i/robert/src/scheduler/schedulable_alarm.hh @@ -25,6 +25,7 @@ // }}} #include "schedulable.hh" #include "utils/callback.hh" +#include "timer/timer.hh" namespace scheduler { @@ -35,12 +36,18 @@ class SchedulableAlarm : public Schedulable int start_, step_; bool periodic_; public: - /// Constructeur. + /// Construit une alarm dans step milliseconde, périodique si periodic est + /// vrai (vrai par defaut), à partir de start si donné, ou de maintenant + /// sinon. template - SchedulableAlarm (T callback, int start, int step, bool periodic = true) + SchedulableAlarm (T callback, int step, bool periodic = true, + int start = -1) : callback_ (callback), start_ (start), step_ (step), periodic_ (periodic) - { } + { + if (start_ == -1) + start_ = Timer::getProgramTime (); + } /// Paramètre le Scheduler. void setup (Scheduler &scheduler, int time, FdSet &readSet, int &timeout); /// Appelé aprés l'attente du Scheduler, renvois true si un événement a diff --git a/2005/i/robert/src/scheduler/scheduler.cc b/2005/i/robert/src/scheduler/scheduler.cc index e37504f..4ef3ade 100644 --- a/2005/i/robert/src/scheduler/scheduler.cc +++ b/2005/i/robert/src/scheduler/scheduler.cc @@ -23,8 +23,8 @@ // }}} #include "scheduler.hh" #include "utils/fd_set.hh" +#include "timer/timer.hh" -#include //XXX #include #include @@ -58,7 +58,7 @@ bool Scheduler::schedule (int timeout/*-1*/, bool returnOnEvent/*false*/) { bool event = false; - int t = time (0) * 1000; //XXX + int t = Timer::getProgramTime (); int start = t; do { @@ -71,24 +71,31 @@ Scheduler::schedule (int timeout/*-1*/, bool returnOnEvent/*false*/) { int top = -1; (*i)->setup (*this, t, readFds, top); + // Si le timeout est plus court, retient ce timeout. if (to == -1 || top != -1 && top < to) - { to = top; - } } // Select. - timeval tv; - tv.tv_sec = to / 1000; - tv.tv_usec = to % 1000 * 1000; - select (FD_SETSIZE, readFds.get (), 0, 0, &tv); + if (to != -1) + { + timeval tv; + tv.tv_sec = to / 1000; + tv.tv_usec = to % 1000 * 1000; + select (FD_SETSIZE, readFds.get (), 0, 0, &tv); + } + else + { + select (FD_SETSIZE, readFds.get (), 0, 0, 0); + } // Run. - t = time (0) * 1000; //XXX + t = Timer::getProgramTime (); for (Schedulables::const_iterator i = schedulables_.begin (); i != schedulables_.end (); ++i) - event |= (*i)->run (*this, t, readFds); - t = time (0) * 1000; //XXX - } while (!(returnOnEvent && event) && start + timeout > t); //XXX + event = (*i)->run (*this, t, readFds) || event; + t = Timer::getProgramTime (); + } while (!(returnOnEvent && event) + && (timeout == -1 || start + timeout > t)); return event; } diff --git a/2005/i/robert/src/scheduler/test_scheduler.cc b/2005/i/robert/src/scheduler/test_scheduler.cc index e16ecb1..8f87e4f 100644 --- a/2005/i/robert/src/scheduler/test_scheduler.cc +++ b/2005/i/robert/src/scheduler/test_scheduler.cc @@ -25,10 +25,10 @@ #include "schedulable_read_fd.hh" #include "schedulable_alarm.hh" #include "utils/bind.hh" +#include "timer/timer.hh" #include #include -#include void ev (void) @@ -41,8 +41,8 @@ ev (void) void to (const char *msg) { - std::cout << "timeout received " << msg << " at " << time (0) * 1000 << - std::endl; + std::cout << "timeout received \"" << msg << "\" at " + << Timer::getProgramTime () << std::endl; } int @@ -54,8 +54,8 @@ main (void) Scheduler s; SchedulableReadFd srf (ev, 0); s.insert (srf); - std::cout << "start at " << time (0) * 1000 << std::endl; - SchedulableAlarm sa1 (utils::bind (to, "3s"), time (0) * 1000, 1000); + std::cout << "start at " << Timer::getProgramTime () << std::endl; + SchedulableAlarm sa1 (utils::bind (to, "1s"), 1000); s.insert (sa1); s.schedule (10000); } -- cgit v1.2.3