Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   Related Pages  

dsched.cpp

Go to the documentation of this file.
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 /* = HUGE_VAL */ )
00084 {
00085     ntime_t ret = 0.0, retp = 0.0;
00086     tsentinel sentinel;
00087     
00088     global_queue.insert( sched_entry( until, NULL ) );
00089 
00090 //  unsigned int c = 0;
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 //      if( ((++c) & 65535) == 0 )
00105 //          cout << ret << "      \r";
00106         i = global_queue.begin();
00107     }
00108 
00109     global_queue.erase(i);
00110     return retp;
00111 }
00112 
00114 } // namespace punnets_common

Generated on Mon Jun 16 15:42:25 2003 for Punnets by doxygen1.2.18