00001 00015 #ifndef OSCL_SCHEDULER_AOBASE_H_INCLUDED 00016 #define OSCL_SCHEDULER_AOBASE_H_INCLUDED 00017 00018 #ifndef OSCL_SCHEDULER_TYPES_H_INCLUDED 00019 #include "oscl_scheduler_types.h" 00020 #endif 00021 00022 #ifndef OSCL_NAMESTRING_H_INCLUDED 00023 #include "oscl_namestring.h" 00024 #endif 00025 00026 #ifndef OSCL_SCHEDULER_THREAD_CONTEXT_H_INCLUDED 00027 #include "oscl_scheduler_threadcontext.h" 00028 #endif 00029 00030 #ifndef OSCL_SCHEDULER_READYQ_H_INCLUDED 00031 #include "oscl_scheduler_readyq.h" 00032 #endif 00033 00034 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED 00035 #include "oscl_string_containers.h" 00036 #endif 00037 00038 /* 00039 * Macro for zeroizing the memory of a newly created object 00040 * 00041 * @param ptr pointer to the newly created object 00042 * 00043 * @param size size of the memory 00044 */ 00045 00046 #define OSCL_ZEROIZE(ptr, size) oscl_memset(ptr, 0, size) 00047 00048 /* 00049 ** Max length for scheduler and AO names. 00050 */ 00051 #define PVEXECNAMELEN 30 00052 00053 #if (PV_SCHED_ENABLE_AO_STATS) 00054 00056 class PVActiveStats 00057 { 00058 private: 00059 //should be constructed only when AO is added to scheduler. 00060 PVActiveStats(OsclExecSchedulerCommonBase* aScheduler, const char* aAOName, PVActiveBase* aActiveBase); 00061 ~PVActiveStats(); 00062 00063 void Combine(PVActiveStats&); 00064 00065 //Queue link for scheduler iPVStatQ 00066 OsclDoubleLink iPVStatQLink; 00067 00068 //this AO's scheduler 00069 OsclExecSchedulerCommonBase* iScheduler; 00070 //AO name 00071 OSCL_HeapString<OsclMemAllocator> iAOName; 00072 //pointer to original container object. 00073 PVActiveBase* iPVActiveBase; 00074 00075 uint32 iNumRun;//how many Run calls 00076 uint32 iNumRunError;//how many RunError calls 00077 int32 iMaxTicksInRun;//max time in any one Run call 00078 00079 uint32 iTotalTicksInRun; 00080 00081 bool i64Valid;//use 64-bit stats instead of 32-bit 00082 int64 i64TotalTicksInRun;//avg number of clock ticks per Run 00083 00084 //for internal computation-- percent of total time in this Run 00085 float iPercent; 00086 00087 int32 iLeave;//last leave code from a Run call 00088 uint32 iNumCancel;//how many DoCancel calls. 00089 00090 uint32 iNumInstances;//number of scheduler instances of this AO. 00091 int32 iPriority;//scheduler priority 00092 00093 friend class PVActiveBase; 00094 friend class OsclExecScheduler; 00095 friend class OsclExecSchedulerCommonBase; 00096 friend class OsclActiveObject; 00097 friend class OsclTimerObject; 00098 friend class OsclReadyQ; 00099 }; 00100 #endif //(PV_SCHED_ENABLE_AO_STATS) 00101 00102 00110 class PVActiveBase 00111 { 00112 public: 00113 uint32 iAddedNum; 00114 00115 //iStatus, AddToScheduler(), RemoveFromScheduler etc are needed in PVSchedulerStopper (which is publically derived from OsclActiveObject and OsclActiveObject is publically derived from PVActiveBase ) 00116 //protected: 00117 00118 PVActiveBase(const char name[], int32 pri); 00119 00120 virtual ~PVActiveBase(); 00121 00122 /* 00123 ** Each AO has a name, to aid in statistics reporting and debugging. 00124 */ 00125 OsclNameString<PVEXECNAMELEN> iName; 00126 00127 /* 00128 ** Each AO knows its thread context, including a pointer to the scheduler 00129 ** that it is in. 00130 */ 00131 PVThreadContext iThreadContext; 00132 00133 #if (PV_SCHED_ENABLE_AO_STATS) 00134 /* 00135 ** AO statistics 00136 */ 00137 PVActiveStats *iPVActiveStats; 00138 friend class PVActiveStats; 00139 #endif 00140 00141 00142 /* 00143 ** Non-Symbian AO implementation. 00144 */ 00145 00146 /* 00147 ** Queue link for scheduler iExecTimerQ or iReadyQ. 00148 */ 00149 TReadyQueLink iPVReadyQLink; 00150 00151 /* 00152 ** Return true if this AO is in any queue. 00153 */ 00154 bool IsInAnyQ() 00155 { 00156 return(iPVReadyQLink.iIsIn != NULL); 00157 } 00158 00159 /* 00160 ** The executing flag is set whenever a request is active (pending 00161 ** or complete). The AO is de-activated by scheduler just before 00162 ** calling the Run. 00163 */ 00164 bool iBusy; 00165 00184 OsclAOStatus iStatus; 00185 00193 virtual int32 RunError(int32 aError) = 0; 00194 00221 virtual void Run() = 0; 00222 00234 virtual void DoCancel() = 0; 00235 00236 /* 00237 ** Common methods to support OsclActiveObject and OsclTimerObject APIs 00238 */ 00239 void AddToScheduler(); 00240 void RemoveFromScheduler(); 00241 void Destroy(); 00242 void Activate(); 00243 OSCL_IMPORT_REF bool IsAdded()const; 00244 void Cancel(); 00245 00246 friend class OsclSchedulerCommonBase; 00247 friend class OsclActiveObject; 00248 friend class OsclTimerObject; 00249 friend class OsclReadyQ; 00250 friend class OsclReadyCompare; 00251 friend class OsclReadySetPosition; 00252 friend class OsclExecScheduler; 00253 00254 }; 00255 00256 #endif 00257 00258 00259 00260