00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef ns_scheduler_h
00038 #define ns_scheduler_h
00039
00040 #include "config.h"
00041
00042
00043 #ifdef HAVE_INT64
00044 typedef int64_t scheduler_uid_t;
00045 #define UID_PRINTF_FORMAT STRTOI64_FMTSTR
00046 #define STRTOUID(S) STRTOI64((S), NULL, 0)
00047 #else
00048 typedef int scheduler_uid_t;
00049 #define UID_PRINTF_FORMAT "%d"
00050 #define STRTOUID(S) atoi((S))
00051 #endif
00052
00053
00054 class Handler;
00055
00056 class Event {
00057 public:
00058 Event* next_;
00059 Event* prev_;
00060 Handler* handler_;
00061 double time_;
00062 scheduler_uid_t uid_;
00063 Event() : time_(0), uid_(0) {}
00064 };
00065
00066
00067
00068
00069
00070
00071 class Handler {
00072 public:
00073 virtual void handle(Event* event) = 0;
00074 };
00075
00076 #define SCHED_START 0.0
00077
00078 class Scheduler : public TclObject {
00079 public:
00080 static Scheduler& instance() {
00081 return (*instance_);
00082 }
00083 void schedule(Handler*, Event*, double delay);
00084 virtual void run();
00085 virtual void cancel(Event*) = 0;
00086 virtual void insert(Event*) = 0;
00087 virtual Event* lookup(scheduler_uid_t uid) = 0;
00088 virtual Event* deque() = 0;
00089 virtual const Event* head() = 0;
00090 double clock() const {
00091 return (clock_);
00092 }
00093 virtual void sync() {};
00094 virtual double start() {
00095 return SCHED_START;
00096 }
00097 virtual void reset();
00098 protected:
00099 void dumpq();
00100 void dispatch(Event*);
00101 void dispatch(Event*, double);
00102 Scheduler();
00103 virtual ~Scheduler();
00104 int command(int argc, const char*const* argv);
00105 double clock_;
00106 int halted_;
00107 static Scheduler* instance_;
00108 static scheduler_uid_t uid_;
00109 };
00110
00111 class ListScheduler : public Scheduler {
00112 public:
00113 ListScheduler() : queue_(0) {}
00114 void cancel(Event*);
00115 void insert(Event*);
00116 Event* deque();
00117 const Event* head() { return queue_; }
00118 Event* lookup(scheduler_uid_t uid);
00119
00120 protected:
00121 Event* queue_;
00122 };
00123
00124 #include "heap.h"
00125
00126 class HeapScheduler : public Scheduler {
00127 public:
00128 HeapScheduler() { hp_ = new Heap; }
00129 void cancel(Event* e) {
00130 if (e->uid_ <= 0)
00131 return;
00132 e->uid_ = - e->uid_;
00133 hp_->heap_delete((void*) e);
00134 }
00135 void insert(Event* e) {
00136 hp_->heap_insert(e->time_, (void*) e);
00137 }
00138 Event* lookup(scheduler_uid_t uid);
00139 Event* deque();
00140 const Event* head() { return (const Event *)hp_->heap_min(); }
00141 protected:
00142 Heap* hp_;
00143 };
00144
00145 class CalendarScheduler : public Scheduler {
00146 public:
00147 CalendarScheduler();
00148 ~CalendarScheduler();
00149 void cancel(Event*);
00150 void insert(Event*);
00151 Event* lookup(scheduler_uid_t uid);
00152 Event* deque();
00153 const Event* head();
00154
00155 protected:
00156 double width_;
00157 double diff0_, diff1_, diff2_;
00158
00159 int stat_qsize_;
00160 int nbuckets_;
00161 int lastbucket_;
00162 int top_threshold_;
00163 int bot_threshold_;
00164
00165 struct Bucket {
00166 Event *list_;
00167 int count_;
00168 } *buckets_;
00169
00170 int qsize_;
00171
00172 virtual void reinit(int nbuck, double bwidth, double start);
00173 virtual void resize(int newsize, double start);
00174 virtual double newwidth(int newsize);
00175
00176 private:
00177 virtual void insert2(Event*);
00178 double cal_clock_;
00179
00180 };
00181
00182 class SplayScheduler : public Scheduler
00183 {
00184 public:
00185 SplayScheduler() : root_(0), qsize_(0) {}
00186 void insert(Event *);
00187 Event *deque();
00188 const Event *head();
00189 void cancel(Event *);
00190 Event *lookup(scheduler_uid_t);
00191
00192
00193
00194 protected:
00195
00196
00197
00198
00199
00200 Event *uid_lookup(Event *);
00201
00202 Event *root_;
00203 scheduler_uid_t lookup_uid_;
00204 int qsize_;
00205 private:
00206 int validate(Event *);
00207 };
00208
00209
00210 #endif