diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/TS_mbufmgr/test20poolceilingfull.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwutils/commsbufs/TS_mbufmgr/test20poolceilingfull.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,221 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +// Test system includes +#ifdef SYMBIAN_OLD_EXPORT_LOCATION +#include "networking/log.h" +#include "networking/teststep.h" +#else +#include +#include +#endif + +#include "TestStepCTMbufmgr.h" +#include "TestSuiteCTMbufmgr.h" + +#include "test20poolceilingfull.h" + + +CTest20PoolCeilingFull::CTest20PoolCeilingFull() + { + iTestStepName = _L("MBufMgrTest20");// Store the name of this test case + } + +CTest20PoolCeilingFull::~CTest20PoolCeilingFull() + { + iChain.Free(); + } + +TVerdict CTest20PoolCeilingFull::doTestStepL() + { + __UHEAP_MARK; + //-------------- substep 1 -------------------- + Log(_L(" 01 Create CMBufManager and install active scheduler:")); + CleanupStack::PushL( iActSch = new(ELeave) CActiveScheduler ); + CActiveScheduler::Install(iActSch); + + RArray createInfoArray; + + TCommsBufPoolCreateInfo createInfo; + createInfo.iBufSize = 256; + createInfo.iInitialBufs = 50; + createInfo.iGrowByBufs = 20; + createInfo.iMinFreeBufs = 4; + createInfo.iCeiling = 100; + createInfoArray.Append(createInfo); + + CreateInstanceMBufMgrL(createInfoArray); + CleanupClosePushL(iBufPond); + createInfoArray.Close (); + + Log(_L(" 02 Create and install active object that will do the test:")); + + CMBufAsyncPoolCeilingFull* poolCeilingFull; + CleanupStack::PushL(poolCeilingFull = new(ELeave) CMBufAsyncPoolCeilingFull(*this)); + + Log(_L(" 03 Start the test:")); + if(poolCeilingFull->DoStartTest() != KErrNone) + { + Log(_L("Error: Async Alloc's failing in test run:")); + User::Leave(EFail); + } + //Clean up stack + CleanupStack::PopAndDestroy(); // poolCeilingFull + CleanupStack::PopAndDestroy(); // bufpond + CActiveScheduler::Install(NULL); + CleanupStack::PopAndDestroy(iActSch); + + __UHEAP_MARKEND; + return EPass; + } + +RCommsBufPond& CTest20PoolCeilingFull::BufPond() + { + return iBufPond; + } + +CMBufAsyncPoolCeilingFull::CMBufAsyncPoolCeilingFull(CTest20PoolCeilingFull& aTestObject) +: CActive(EPriorityStandard), + iTestObject(aTestObject) + { + CActiveScheduler::Add(this); + } + + +CMBufAsyncPoolCeilingFull::~CMBufAsyncPoolCeilingFull() + { + Cancel(); + iAsyncChain.Free(); + } + +void CMBufAsyncPoolCeilingFull::CompleteSelf() + { + TRequestStatus* pStat = &iStatus; + User::RequestComplete(pStat, KErrNone); + SetActive(); + } + +void CMBufAsyncPoolCeilingFull::RunL() + { + User::LeaveIfError(iStatus.Int()); + + if((iThread1.ExitType() != EExitPending)) + { + CActiveScheduler::Stop(); + return; + } + if(iAsyncChain.IsEmpty()) + { + iAsyncRequest.Alloc(iAsyncChain, 256 * 8, iStatus); + SetActive(); + } + else + { + iAsyncChain.Free(); + CompleteSelf(); + } + } + +void CMBufAsyncPoolCeilingFull::DoCancel() + { + iAsyncRequest.Cancel(); + } + + +TInt CMBufAsyncPoolCeilingFull::DoStartTest() + { + + TInt err=iThread1.Create(_L("testThread1Rec"), + fThread1, + KDefaultStackSize, + KDefaultHeapSize, + KMaxHeapSize, + (TAny*)&iTestObject, + EOwnerProcess); + if (err!=KErrNone) + { + User::Leave(EFail); + } + iThread1.SetPriority(EPriorityAbsoluteHigh); + iThread1.Resume(); + iAsyncRequest.Alloc(iAsyncChain, 256, iStatus); + SetActive(); + CActiveScheduler::Start(); + + iThread1.Close(); + iThread2.Close(); + iThread3.Close(); + + return iError; + } + + +TInt CMBufAsyncPoolCeilingFull::fThread1(TAny* aInput) + { + TInt totalAllocation = 100; + CTest20PoolCeilingFull* pTestObject = (CTest20PoolCeilingFull*)aInput; + // We need to introduce this new client thread to the MBufMgr + TCommsBufPondTLSOp tls(pTestObject->BufPond()); + tls.Set(); + + CTrapCleanup* aCleanup = CTrapCleanup::New(); + + //Install active scheduler + CActiveScheduler* aActSch = new CActiveScheduler; + if(aActSch==NULL) + { + return KErrNoMemory; + } + CActiveScheduler::Install(aActSch); + + RTimer aTimer; + TRequestStatus aTimerStatus; // Request status associated with timer + aTimer.CreateLocal(); // Create timer for this thread + TBool freeMem = EFalse; + for(TInt i=0; i < 1000; ++i) + { + RMBufChain chain; + chain.Alloc(512, 256, 256); + if(freeMem) + { + chain.Free(); + freeMem = EFalse; + } + else + { + pTestObject->iChain.Append(chain); + freeMem = ETrue; + } + if(pTestObject->iChain.NumBufs() == totalAllocation) + { + // Free all. Will trigger the AO. + pTestObject->iChain.Free(); + break; + } + //Sleep for 5ms + aTimer.After(aTimerStatus,5000); + User::WaitForRequest(aTimerStatus); + } + CActiveScheduler::Install(NULL); + delete aActSch; + delete aCleanup; + return KErrNone; + } + + +