scheduler.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1994 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * @(#) $Header: /cvsroot/nsnam/ns-2/common/scheduler.h,v 1.28 2007/12/04 19:59:31 seashadow Exp $ (LBL)
  35.  */
  36. #ifndef ns_scheduler_h
  37. #define ns_scheduler_h
  38. #include "config.h"
  39. // Make use of 64 bit integers if available.
  40. #ifdef HAVE_INT64
  41. typedef int64_t scheduler_uid_t;
  42. #define UID_PRINTF_FORMAT STRTOI64_FMTSTR
  43. #define STRTOUID(S) STRTOI64((S), NULL, 0)
  44. #else
  45. typedef int scheduler_uid_t;
  46. #define UID_PRINTF_FORMAT "%d"
  47. #define STRTOUID(S) atoi((S))
  48. #endif
  49. class Handler;
  50. class Event {
  51. public:
  52. Event* next_; /* event list */
  53. Event* prev_;
  54. Handler* handler_; /* handler to call when event ready */
  55. double time_; /* time at which event is ready */
  56. scheduler_uid_t uid_; /* unique ID */
  57. Event() : time_(0), uid_(0) {}
  58. };
  59. /*
  60.  * The base class for all event handlers.  When an event's scheduled
  61.  * time arrives, it is passed to handle which must consume it.
  62.  * i.e., if it needs to be freed it, it must be freed by the handler.
  63.  */
  64. class Handler {
  65.  public:
  66. virtual ~Handler () {}
  67. virtual void handle(Event* event) = 0;
  68. };
  69. #define SCHED_START 0.0 /* start time (secs) */
  70. class Scheduler : public TclObject {
  71. public:
  72. static Scheduler& instance() {
  73. return (*instance_); // general access to scheduler
  74. }
  75. void schedule(Handler*, Event*, double delay); // sched later event
  76. virtual void run(); // execute the simulator
  77. virtual void cancel(Event*) = 0; // cancel event
  78. virtual void insert(Event*) = 0; // schedule event
  79. virtual Event* lookup(scheduler_uid_t uid) = 0; // look for event
  80. virtual Event* deque() = 0; // next event (removes from q)
  81. virtual const Event* head() = 0; // next event (not removed from q)
  82. double clock() const { // simulator virtual time
  83. return (clock_);
  84. }
  85. virtual void sync() {};
  86. virtual double start() { // start time
  87. return SCHED_START;
  88. }
  89. virtual void reset();
  90. protected:
  91. void dumpq(); // for debug: remove + print remaining events
  92. void dispatch(Event*); // execute an event
  93. void dispatch(Event*, double); // exec event, set clock_
  94. Scheduler();
  95. virtual ~Scheduler();
  96. int command(int argc, const char*const* argv);
  97. double clock_;
  98. int halted_;
  99. static Scheduler* instance_;
  100. static scheduler_uid_t uid_;
  101. };
  102. class ListScheduler : public Scheduler {
  103. public:
  104. ListScheduler() : queue_(0) {}
  105. void cancel(Event*);
  106. void insert(Event*);
  107. Event* deque();
  108. const Event* head() { return queue_; }
  109. Event* lookup(scheduler_uid_t uid);
  110. protected:
  111. Event* queue_;
  112. };
  113. #include "heap.h"
  114. class HeapScheduler : public Scheduler {
  115. public:
  116. HeapScheduler() { hp_ = new Heap; } 
  117. void cancel(Event* e) {
  118. if (e->uid_ <= 0)
  119. return;
  120. e->uid_ = - e->uid_;
  121. hp_->heap_delete((void*) e);
  122. }
  123. void insert(Event* e) {
  124. hp_->heap_insert(e->time_, (void*) e);
  125. }
  126. Event* lookup(scheduler_uid_t uid);
  127. Event* deque();
  128. const Event* head() { return (const Event *)hp_->heap_min(); }
  129. protected:
  130. Heap* hp_;
  131. };
  132. class CalendarScheduler : public Scheduler {
  133. public:
  134. CalendarScheduler();
  135. ~CalendarScheduler();
  136. void cancel(Event*);
  137. void insert(Event*);
  138. Event* lookup(scheduler_uid_t uid);
  139. Event* deque();
  140. const Event* head();
  141. protected:
  142. double min_bin_width_; // minimum bin width for Calendar Queue
  143. unsigned int adjust_new_width_interval_; // The interval (in unit of resize time) for adjustment of bin width. A zero value disables automatic bin width adjustment
  144. unsigned time_to_newwidth; // how many time we failed to adjust the width based on snoopy-queue
  145. long unsigned head_search_;
  146. long unsigned insert_search_;
  147. int round_num_;
  148. long int gap_num_; //the number of gap samples in this window (in process of calculation)
  149. double last_time_; //the departure time of first event in this window
  150. double avg_gap_; //the average gap in last window (finished calculation)
  151. double width_;
  152. double diff0_, diff1_, diff2_; /* wrap-around checks */
  153. int stat_qsize_; /* # of distinct priorities in queue*/
  154. int nbuckets_;
  155. int lastbucket_;
  156. int top_threshold_;
  157. int bot_threshold_;
  158. struct Bucket {
  159. Event *list_;
  160. int    count_;
  161. } *buckets_;
  162. int qsize_;
  163. virtual void reinit(int nbuck, double bwidth, double start);
  164. virtual void resize(int newsize, double start);
  165. virtual double newwidth(int newsize);
  166. private:
  167. virtual void insert2(Event*);
  168. double cal_clock_;  // same as clock in sims, may be different in RT-scheduling.
  169. };
  170. class SplayScheduler : public Scheduler 
  171. {
  172. public:
  173. SplayScheduler() : root_(0), qsize_(0) {}
  174. void insert(Event *);
  175. Event *deque();
  176. const Event *head();
  177. void cancel(Event *);
  178. Event *lookup(scheduler_uid_t);
  179. //void validate() { assert(validate(root_) == qsize_); };
  180.     
  181. protected:
  182. /* XXX even if debug is enabled, we want these inlined, so
  183.    XXX they are defined as macros in splay-scheduler.cc
  184.    Event *&LEFT(Event *e)  { return e->prev_; }
  185.    Event *&RIGHT(Event *e) { return e->next_; }
  186. */
  187. Event *uid_lookup(Event *);
  188. Event *root_;
  189. scheduler_uid_t  lookup_uid_;
  190. int  qsize_;
  191. private:
  192. int validate(Event *);
  193. };
  194. #endif