00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00023 #include "timerentry.h"
00024
00029 CTimerEntry* CTimerEntry::NewL(CConsoleBase* aConsole)
00030 {
00031 CTimerEntry* self = new (ELeave) CTimerEntry(aConsole);
00032 CleanupStack::PushL(self);
00033 self->ConstructL();
00034 CleanupStack::Pop(self);
00035 return self;
00036 }
00037
00041 void CTimerEntry::ConstructL()
00042 {
00043
00044 CTimer::ConstructL();
00045
00046 CActiveScheduler::Add(this);
00047 }
00048
00053 CTimerEntry::CTimerEntry(CConsoleBase* aConsole):
00054
00055 CTimer(CActive::EPriorityStandard),
00056
00057 iIterator(iQueue),
00058
00059 iCount(-1),
00060
00061
00062 iOp(EInsert),
00063 iConsole(aConsole),
00064 iWaitFlag(ETrue)
00065 {
00066 }
00067
00071 void CTimerEntry::RunL()
00072 {
00073
00074 ArbitratorL();
00075
00076 PrintQue();
00077
00078 IssueRequest();
00079 }
00080
00081
00085 void CTimerEntry::IssueRequest()
00086 {
00087
00088
00089 TUint waitTime = KWaitTime;
00090 if (iWaitFlag)
00091 {
00092 waitTime = Math::Random() % KMaxTimeToWait;
00093
00094 waitTime++;
00095 }
00096 CTimer::After((waitTime) * 1000000);
00097 }
00098
00104 void CTimerEntry::ArbitratorL()
00105 {
00106
00107
00108 if(iOp == EInsert)
00109 {
00110
00111 TInt tc = (TInt)User::TickCount();
00112
00113 TBool redo = AddToQueueL(tc);
00114
00115 if(!redo)
00116 {
00117 _LIT(KTextQueFull,"Queue is full!\n");
00118 iConsole->Printf(KTextQueFull);
00119
00120
00121
00122
00123 iWaitFlag = EFalse;
00124 }
00125 }
00126
00127
00128 else
00129 {
00130
00131 TBool redo = RemoveFromQueue();
00132
00133 if(!redo)
00134 {
00135 _LIT(KTextQueEmpty,"Queue is empty!\n");
00136 iConsole->Printf(KTextQueEmpty);
00137
00138
00139
00140
00141 iWaitFlag = ETrue;
00142 }
00143 }
00144 }
00145
00151 TBool CTimerEntry::AddToQueueL(TInt aTicks)
00152 {
00153
00154 if(iCount >= (KMaxEntry - 1))
00155 {
00156 iOp = ERemove;
00157 return EFalse;
00158 }
00159
00160
00161 _LIT(KTextAddTick,"Added %d to the queue\n");
00162 iConsole->Printf(KTextAddTick,aTicks);
00163 iCount++;
00164
00165 TTimerEntry* ptr = new (ELeave) TTimerEntry;
00166 iQueue.Add(*ptr,aTicks);
00167
00168 return ETrue;
00169 }
00170
00174 void CTimerEntry::PrintQue()
00175 {
00176 _LIT(KTextCont,"Contents of the List:\n***\nINDEX\tDELTA\n");
00177 iConsole->Printf(KTextCont);
00178
00179 iIterator.SetToFirst();
00180
00181 TTimerEntry *ptr = iIterator++;
00182
00183 TInt ix = 0;
00184 while (ptr != NULL)
00185 {
00186 _LIT(KTextFormat,"%d\t\t%d\n");
00187 iConsole->Printf(KTextFormat,ix,ptr->iLink.iDelta);
00188 ptr = iIterator++;
00189 ix++;
00190 }
00191 _LIT(KTextEnd,"***\n");
00192 iConsole->Printf(KTextEnd);
00193 }
00194
00199 TBool CTimerEntry::RemoveFromQueue()
00200 {
00201
00202 if(iCount < 0)
00203 {
00204 iOp = EInsert;
00205 return EFalse;
00206 }
00207
00208 iIterator.SetToFirst();
00209
00210
00211 TInt pos = 0;
00212
00213
00214 if(iCount > 0)
00215 {
00216 pos = Math::Random() % iCount;
00217 }
00218
00219
00220
00221 for(TInt ix = 1; ix <= pos; ix++)
00222 {
00223 iIterator++;
00224 }
00225
00226 TTimerEntry* ptr = iIterator;
00227
00228 _LIT(KTextRemove,"Removed an element from the queue. Index: %d\n");
00229 iConsole->Printf(KTextRemove,pos);
00230
00231
00232 iQueue.Remove(*ptr);
00233 delete ptr;
00234
00235 iCount--;
00236
00237 return ETrue;
00238 }
00239
00245 CTimerEntry::~CTimerEntry()
00246 {
00247
00248 Cancel();
00249
00250 if(iIterator)
00251 {
00252 iIterator.SetToFirst();
00253
00254 TTimerEntry *ptr = iIterator++;
00255 while (ptr != NULL)
00256 {
00257 delete ptr;
00258 ptr = iIterator++;
00259 }
00260 }
00261 }
00262
00266 void CTimerEntry::DoCancel()
00267 {
00268
00269 CTimer::DoCancel();
00270 }
00271