00001 #ifndef SCHEDULER_H_ 00002 #define SCHEDULER_H_ 00003 00004 #include <utility/queue.h> 00005 #include "cache.h" 00006 #include "ep_cvec.h" 00007 00008 __BEGIN_SYS 00009 00010 class Thread; 00011 00016 class Scheduler { 00017 public: 00018 static int init(System_Info* si); 00019 00020 static inline Scheduler& getInstance() { 00021 return _instance; 00022 } 00023 00024 void addThread(Thread* thread); 00025 00026 static void schedule() { 00027 Scheduler::getInstance().yield(); 00028 } 00029 00030 void yield(); 00031 00032 void exit(int status = 0); 00033 void exit(Thread* thread, int status); 00034 00035 inline Thread& getRunning() { 00036 return *_running; 00037 } 00038 00039 void pass(Thread* thread); 00040 00041 void resume(Thread* thread); 00042 00043 void suspend(Thread* thread); 00044 00045 void cacheThreadStack(CPU::Log_Addr stack); 00046 00047 CPU::Log_Addr getThreadStack(unsigned int size); 00048 00049 private: 00050 inline Scheduler() : _running(0), _isCached(false) {} 00051 00052 inline void insertOnReady(Thread* thread); 00053 00054 inline Thread* getNext(); 00055 00056 typedef Queue<Thread> ThreadQueue; 00057 typedef OrderedCVector<Thread*> ThreadCircVec; 00058 00059 ThreadQueue _suspended; 00060 00064 ThreadCircVec* _readyP; 00065 00066 Thread* volatile _running; 00067 Thread* _main; 00068 static Scheduler _instance; 00069 00070 bool _isCached; 00071 00072 Cache<CPU::Log_Addr, Traits<Thread>::STACK_CACHE_SIZE> _stackCache; 00073 }; 00074 00075 __END_SYS 00076 00077 #endif