Main Page   Modules   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

oscl_scheduler.h

Go to the documentation of this file.
00001 
00013 #ifndef OSCL_SCHEDULER_H_INCLUDED
00014 #define OSCL_SCHEDULER_H_INCLUDED
00015 
00016 #ifndef OSCL_SCHEDULER_TYPES_H_INCLUDED
00017 #include "oscl_scheduler_types.h"
00018 #endif
00019 
00020 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED
00021 #include "oscl_scheduler_ao.h"
00022 #endif
00023 
00024 #ifndef OSCL_SCHEDULER_THREADCONTEXT_H_INCLUDED
00025 #include "oscl_scheduler_threadcontext.h"
00026 #endif
00027 
00028 #ifndef OSCL_MUTEX_H_INCLUDED
00029 #include "oscl_mutex.h"
00030 #endif
00031 
00032 #ifndef OSCL_SEMAPHORE_H_INCLUDED
00033 #include "oscl_semaphore.h"
00034 #endif
00035 
00036 #ifndef OSCL_SCHEDULER_READYQ_H_INCLUDED
00037 #include "oscl_scheduler_readyq.h"
00038 #endif
00039 
00040 #ifndef OSCL_DEFALLOC_H_INCLUDED
00041 #include "oscl_defalloc.h"
00042 #endif
00043 
00044 #ifndef OSCL_MEM_H_INCLUDED
00045 #include "oscl_mem.h"
00046 #endif
00047 
00048 class Oscl_DefAlloc;
00049 class OsclCoeActiveScheduler;
00050 
00051 
00055 class OsclScheduler
00056 {
00057     public:
00067         OSCL_IMPORT_REF static void Init(const char *name, Oscl_DefAlloc *alloc = NULL, int nreserve = 20);
00068 
00069 
00074         OSCL_IMPORT_REF static void Cleanup();
00075 };
00076 
00077 
00082 #define PVSCHEDNAMELEN 30
00083 
00084 class PVSchedulerStopper;
00085 class PVJump;
00086 class PVLogger;
00087 
00095 class OsclSchedulerObserver
00096 {
00097     public:
00107         virtual void OsclSchedulerTimerCallback(OsclAny* aContext, uint32 aDelayMsec) = 0;
00108 
00118         virtual void OsclSchedulerReadyCallback(OsclAny* aContext) = 0;
00119 
00120         virtual ~OsclSchedulerObserver() {}
00121 };
00122 
00123 
00124 /*
00125 ** A common base class for variations of OsclExecScheduler
00126 **/
00127 
00128 class OsclExecSchedulerCommonBase
00129 {
00130     public:
00140         OSCL_IMPORT_REF void StartScheduler(OsclSemaphore *sem = NULL);
00141 
00146         OSCL_IMPORT_REF void StopScheduler();
00147 
00152         OSCL_IMPORT_REF void SuspendScheduler();
00153 
00158         OSCL_IMPORT_REF void ResumeScheduler();
00159 
00165         OSCL_IMPORT_REF void StartNativeScheduler();
00166 
00170         OSCL_IMPORT_REF static OsclNameString<PVSCHEDNAMELEN> *GetName();
00171 
00175         OSCL_IMPORT_REF static uint32 GetId();
00176 
00177 
00178     protected:
00179         /*
00180         static OsclExecScheduler *NewL(const char *name,Oscl_DefAlloc *a,int nreserve);
00181         */
00182         virtual ~OsclExecSchedulerCommonBase();
00183         void InstallScheduler();
00184         void UninstallScheduler();
00185         friend class OsclScheduler;
00186 
00187     protected:
00188         void Error(int32 anError) const;
00189 
00190     protected:
00191         static OsclExecSchedulerCommonBase* GetScheduler();
00192         static OsclExecSchedulerCommonBase* SetScheduler(OsclExecSchedulerCommonBase*);
00193         friend class PVThreadContext;
00194         friend class OsclCoeActiveScheduler;
00195 
00196     protected:
00197         OsclExecSchedulerCommonBase(Oscl_DefAlloc*);
00198         virtual void ConstructL(const char *name, int);
00199 
00200         void BeginScheduling(bool blocking, bool native);
00201         void EndScheduling();
00202 
00203         void BlockingLoopL();
00204 
00205         bool iBlockingMode;//current blocking mode setting.
00206         bool iNativeMode;//current native mode setting.
00207 
00208         bool IsStarted();
00209         inline bool IsInstalled();
00210 
00211         //Stopper AO is a special PV AO used to implement
00212         //the StopScheduler and SuspendScheduler functions.
00213         PVSchedulerStopper *iStopper;
00214         OsclNoYieldMutex iStopperCrit;
00215 
00216         //Scheduler thread context
00217         PVThreadContext iThreadContext;
00218 
00219         //Scheduler name
00220         OsclNameString<PVSCHEDNAMELEN> iName;
00221 
00222         //For stop, suspend, and resume commands.
00223         bool iDoStop;
00224         bool iDoSuspend;
00225         bool iSuspended;
00226         OsclSemaphore iResumeSem;
00227 
00228         OsclErrorTrapImp* iErrorTrapImp;
00229 
00230         //Ready AO queue.  The AOs in this queue are ready to run.
00231         OsclReadyQ iReadyQ;
00232 
00233         //Pending Timer AO queue.  The AOs in this queue are OsclTimerObjects
00234         //and have a timeout pending.
00235         OsclTimerQ iExecTimerQ;
00236         void AddToExecTimerQ(PVActiveBase *active, uint32);
00237 
00238         void PendComplete(PVActiveBase *, int32 aReason, TPVThreadContext aContext);
00239         void RequestCanceled(PVActiveBase*);
00240 
00241         //Scheduling loop implementation.
00242         PVActiveBase* UpdateTimers(uint32 &aDelay);
00243         PVActiveBase* UpdateTimersMsec(uint32 &aDelay);
00244         PVActiveBase* WaitForReadyAO();
00245         void CallRunExec(PVActiveBase*);
00246 
00247         static const uint32 iTimeCompareThreshold;
00248         friend class OsclTimerCompare;
00249         friend class OsclReadyQ;
00250 
00251         friend class OsclError;
00252 
00253 
00254 
00255         uint32 iNumAOAdded;//for non-fair-scheduling sorts.
00256 
00257         //For statistics
00258 #if (PV_SCHED_ENABLE_AO_STATS)
00259         OsclDoubleList<PVActiveStats> iPVStatQ;//queue of all PV ExecObjs.
00260         enum TOtherExecStats
00261         {
00262             EOtherExecStats_WaitTime //scheduler wait time
00263             , EOtherExecStats_QueueTime //scheduler queue operation time
00264             , EOtherExecStats_NativeOS //time in symbian native ExecObjs, not added by PV code (symbian only)
00265             , EOtherExecStats_ReleaseTime //thread release time (Brew only)
00266             , EOtherExecStats_Last
00267         };
00268         PVActiveStats* iOtherExecStats[EOtherExecStats_Last];//placeholder for stats of all ExecObjs.
00269         void ConstructStatQ();
00270         void BeginStats();
00271         void EndStats();
00272         static void ShowStats(PVActiveStats *active);
00273         static void ShowSummaryStats(PVActiveStats *active, PVLogger*, int64, int64&, float&);
00274         void CleanupStatQ();
00275         uint8* iTotalTicksTemp;
00276         int64 iGrandTotalTicks;
00277         float iTotalPercent;
00278         friend class PVActiveStats;
00279         uint32 iTime;
00280         int32 iDelta;
00281         PVActiveStats* iPVStats;
00282 #endif //PV_SCHED_ENABLE_AO_STATS
00283 
00284         //Queue utils.
00285         PVActiveBase *FindPVBase(PVActiveBase *active, OsclDoubleList<PVActiveBase> &);
00286         void CleanupExecQ();
00287         void InitExecQ(int);
00288 
00289         PVLogger *iLogger;
00290         PVLogger* iDebugLogger;
00291 
00292 #if(PV_SCHED_ENABLE_PERF_LOGGING)
00293         //for perf logging
00294         char* iLogPerfIndentStr;
00295         int32 iLogPerfIndentStrLen;
00296         uint32 iLogPerfTotal;
00297         void ResetLogPerf();
00298         void IncLogPerf(uint32);
00299 #endif
00300 
00301         Oscl_DefAlloc *iAlloc;//allocator for scheduler.
00302         OsclMemAllocator iDefAlloc;//default allocator
00303 
00304         friend class OsclActiveObject;
00305         friend class OsclTimerObject;
00306         friend class PVActiveBase;
00307         friend class PVSchedulerStopper;
00308 
00309 
00310         friend class OsclExecScheduler;
00311 };
00312 
00313 class OsclErrorTrapImp;
00314 
00315 class OsclExecScheduler: public OsclExecSchedulerCommonBase
00316             , public OsclExecSchedulerBase
00317 {
00318     public:
00323         OSCL_IMPORT_REF static OsclExecScheduler* Current();
00324 
00347         OSCL_IMPORT_REF void RunSchedulerNonBlocking(int32 aTargetCount, int32 &aReady, uint32 &aDelayMsec);
00348 
00356         OSCL_IMPORT_REF void RegisterForCallback(OsclSchedulerObserver* aCallback, OsclAny* aCallbackContext);
00357 
00358 
00359     private:
00360         static OsclExecScheduler *NewL(const char *name, Oscl_DefAlloc *a, int nreserve);
00361         ~OsclExecScheduler();
00362         friend class OsclScheduler;
00363 
00364 
00365         OsclExecScheduler(Oscl_DefAlloc*);
00366         void ConstructL(const char *name, int);
00367 
00368 };
00369 
00370 
00375 class PVSchedulerStopper: public OsclActiveObject
00376 {
00377     public:
00378         PVSchedulerStopper();
00379         ~PVSchedulerStopper();
00380     private:
00381         void Run();
00382 };
00383 
00384 
00385 #endif
00386 
00387 

OSCL API
Posting Version: OPENCORE_20090310