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