00001
00026 #include "dsched.h"
00027
00029 namespace punnets_common {
00031
00037 class tsentinel : public taction
00038 {
00039 bool processed;
00040
00041 public:
00042 tsentinel() : taction(), processed(false) { }
00043
00044 bool isProcessed() { return processed; }
00045
00046 virtual void activate(tscheduler &, ntime_t)
00047 {
00048 processed = true;
00049 }
00050 tqueue *queue() const{ return NULL; }
00051
00052 virtual const char *getClassName() const { return "tsentinel"; };
00053 };
00054
00055
00056 tsched_double::tsched_double()
00057 {
00058 }
00059
00060 void tsched_double::scheduleEvent(const tevent &event)
00061 {
00062 tqueue *q = event.getAction().queue();
00063 bool need_insert = false;
00064 if( q != processing_queue )
00065 {
00066 if( q->empty() )
00067 need_insert = true;
00068 else {
00069 ntime_t prev_top = q->top().getTime();
00070 if( prev_top > event.getTime() )
00071 {
00072 global_queue.erase(make_pair(prev_top, q));
00073 need_insert = true;
00074 }
00075 }
00076 }
00077 q->push(event);
00078 if( need_insert )
00079 global_queue.insert(make_pair(event.getTime(), q));
00080 }
00081
00082
00083 ntime_t tsched_double::run(ntime_t until )
00084 {
00085 ntime_t ret = 0.0, retp = 0.0;
00086 tsentinel sentinel;
00087
00088 global_queue.insert( sched_entry( until, NULL ) );
00089
00090
00091
00092 std::set< sched_entry, less_sched_entry >::iterator i = global_queue.begin();
00093
00094 while( i->second != NULL )
00095 {
00096 tqueue *q = i->second;
00097 processing_queue = q;
00098 tevent event = q->top();
00099 q->pop();
00100 global_queue.erase(i);
00101 event.activate( *this );
00102 if( ! q->empty() )
00103 global_queue.insert( make_pair( q->top().getTime(), q ) );
00104
00105
00106 i = global_queue.begin();
00107 }
00108
00109 global_queue.erase(i);
00110 return retp;
00111 }
00112
00114 }