summaryrefslogtreecommitdiff
path: root/2005/i/robert/src/scheduler
diff options
context:
space:
mode:
Diffstat (limited to '2005/i/robert/src/scheduler')
-rw-r--r--2005/i/robert/src/scheduler/Makefile.defs5
-rw-r--r--2005/i/robert/src/scheduler/schedulable.hh7
-rw-r--r--2005/i/robert/src/scheduler/schedulable_alarm.cc2
-rw-r--r--2005/i/robert/src/scheduler/schedulable_alarm.hh13
-rw-r--r--2005/i/robert/src/scheduler/scheduler.cc31
-rw-r--r--2005/i/robert/src/scheduler/test_scheduler.cc10
6 files changed, 43 insertions, 25 deletions
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<typename T>
- 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 <stdlib.h> //XXX
#include <sys/types.h>
#include <sys/time.h>
@@ -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 <iostream>
#include <unistd.h>
-#include <time.h>
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<void> (to, "3s"), time (0) * 1000, 1000);
+ std::cout << "start at " << Timer::getProgramTime () << std::endl;
+ SchedulableAlarm sa1 (utils::bind<void> (to, "1s"), 1000);
s.insert (sa1);
s.schedule (10000);
}