00001 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). 00002 // All rights reserved. 00003 // This component and the accompanying materials are made available 00004 // under the terms of "Eclipse Public License v1.0" 00005 // which accompanies this distribution, and is available 00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". 00007 // 00008 // Initial Contributors: 00009 // Nokia Corporation - initial contribution. 00010 // 00011 // Contributors: 00012 // 00013 // Description: 00014 // Contains the definition of member functions of the CConsumer class. 00015 // 00016 00017 00018 00023 #include "consumer.h" 00024 00031 CConsumer* CConsumer::NewL(CConsoleBase* aConsole,CQueue* aTokens) 00032 { 00033 CConsumer* self = new (ELeave)CConsumer; 00034 CleanupStack::PushL(self); 00035 self->ConstructL(aConsole,aTokens); 00036 CleanupStack::Pop(self); 00037 return self; 00038 } 00039 00051 void CConsumer::ConstructL(CConsoleBase* aConsole,CQueue* aTokens) 00052 { 00053 iConsole = aConsole; 00054 iQueue = aTokens; 00055 00056 // Create an object of the CPeriodic class. 00057 iPeriodicCons = CPeriodic::NewL(CActive::EPriorityUserInput); 00058 00059 // Create the Consumer thread. 00060 _LIT(KConsumer,"ConsumerThread"); 00061 User::LeaveIfError(iConsThread.Create(KConsumer,ConsThreadFunc,KDefaultStackSize,KMinHeapSize,256*KMinHeapSize,iQueue,EOwnerThread)); 00062 iConsThread.SetPriority(EPriorityMore); 00063 00064 // Make the Consumer thread more intensive than the Producer thread. 00065 // Consumer thread frequency is twice the Producer thread frequency. 00066 // Associate RemoveFunction() as the call back function for the iPeriodicCons object. 00067 iPeriodicCons->Start(2000000,2000000,TCallBack(RemoveFunction,this)); 00068 } 00069 00073 CConsumer::CConsumer() 00074 { 00075 } 00076 00082 TInt CConsumer::ConsThreadFunc(TAny* aPtr) 00083 { 00084 // The while loop mechanism ensures that the thread performs the CQueue::Remove() operation each time RThread::Resume() is invoked on the thread handle. 00085 while(true) 00086 { 00087 CQueue* ptr = (CQueue*)aPtr; 00088 __ASSERT_ALWAYS(ptr,User::Panic(KTxtPanic,-1)); 00089 // Remove a token from the queue. 00090 ptr->Remove(); 00091 // Suspend the thread. 00092 RThread().Suspend(); 00093 } 00094 return KErrNone; 00095 } 00096 00097 00101 void CConsumer::ResumeCons() 00102 { 00103 // Call the RThread::Resume() function on the consumer thread. 00104 // Control goes to the CConsumer::ConsThreadFunc() function after this statement. 00105 iConsThread.Resume(); 00106 } 00107 00111 CConsumer::~CConsumer() 00112 { 00113 iConsThread.Kill(KErrCancel); 00114 delete iPeriodicCons; 00115 } 00116 00117 00123 TInt CConsumer::RemoveFunction(TAny* aPtr) 00124 { 00125 CConsumer* ptr = static_cast<CConsumer*> (aPtr); 00126 __ASSERT_ALWAYS(ptr,User::Panic(KTxtPanic,-1)); 00127 // Invoke the RThread::Resume() function on the consumer thread repeatedly. 00128 ptr->ResumeCons(); 00129 return KErrNone; 00130 }
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.