diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/src/CamMemoryMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/src/CamMemoryMonitor.cpp Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,288 @@ +/* +* Copyright (c) 2007-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: Class that monitors free memory and attempts to free it if necessary +* +*/ + +#include "CamMemoryMonitor.h" + + +#include +#include +#include +#include +#include +#include "CamAppUi.h" +#include "CamAppController.h" +#include "camlogging.h" + + +const static TInt KMemoryCheckInterval = 10*1000*1000; +const static TInt KNeededMemoryLevel = 20*1024*1024; +const static TInt KCriticalMemoryLevel = 18*1024*1024; + + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::NewL +// --------------------------------------------------------------------------- +// +CCamMemoryMonitor* CCamMemoryMonitor::NewL(CCamAppUi* aAppUi, CCamAppController* aController) + { + CCamMemoryMonitor* self = new (ELeave) CCamMemoryMonitor( aAppUi, aController ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self; + return self; + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::~CCamMemoryMonitor +// --------------------------------------------------------------------------- +// +CCamMemoryMonitor::~CCamMemoryMonitor() + { + PRINT( _L("Camera => CCamMemoryMonitor::~CCamMemoryMonitor") ) + if ( iMemoryCheckTimer ) + { + iMemoryCheckTimer->Cancel(); + delete iMemoryCheckTimer; + } + PRINT( _L("Camera <= CCamMemoryMonitor::~CCamMemoryMonitor") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::StartMonitoring +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::StartMonitoring( TInt aLimit, TInt aRequestAmount ) + { + PRINT( _L("Camera => CCamMemoryMonitor::StartMonitoring") ) + if ( !iMemoryCheckTimer->IsActive() ) + { + iLimit = aLimit; + iRequestAmount = aRequestAmount; + iMemoryCheckTimer->Start( KMemoryCheckInterval, KMemoryCheckInterval, + TCallBack( MemoryCheck, this ) ); + } + PRINT( _L("Camera <= CCamMemoryMonitor::StartMonitoring") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::StartMonitoring +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::StartMonitoring() + { + PRINT( _L("Camera => CCamMemoryMonitor::StartMonitoring") ) + if ( !iMemoryCheckTimer->IsActive() ) + { + iMemoryCheckTimer->Start( KMemoryCheckInterval, KMemoryCheckInterval, + TCallBack( MemoryCheck, this ) ); + } + PRINT( _L("Camera <= CCamMemoryMonitor::StartMonitoring") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::StopMonitoring +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::StopMonitoring() + { + PRINT( _L("Camera => CCamMemoryMonitor::StopMonitoring") ) + iMemoryCheckTimer->Cancel(); + PRINT( _L("Camera <= CCamMemoryMonitor::StopMonitoring") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::CheckAndRequestMemoryL +// --------------------------------------------------------------------------- +// +TInt CCamMemoryMonitor::CheckAndRequestMemoryL( TInt aLimit, TInt aRequestAmount, TBool aShowNote ) + { + + PRINT( _L("Camera => CCamMemoryMonitor::CheckAndRequestMemoryL") ) + if ( IsActive() ) + { + return KErrNone; + } + + TInt memoryLeft = 0; + TInt errorCode = KErrNone; + HAL::Get( HALData::EMemoryRAMFree, memoryLeft ); + if ( memoryLeft < aLimit ) + { + PRINT( _L("Camera <> CCamMemoryMonitor::CheckAndRequestMemoryL memory below limit, requesting") ) + HBufC* freeMemText = NULL; + CAknGlobalNote* note = NULL; + TInt noteId = 0; + if ( aShowNote ) + { + + freeMemText = StringLoader::LoadL( R_NOTE_TEXT_FREE_MEMORY ); + CleanupStack::PushL( freeMemText ); + // show error note + note = CAknGlobalNote::NewL(); + CleanupStack::PushL( note ); + + note->SetTextProcessing( ETrue ); + note->SetPriority(CActive::EPriorityHigh); + noteId = note->ShowNoteL(EAknGlobalWaitNote, *freeMemText); + } + + User::LeaveIfError( iOomMonitor.Connect() ); + + errorCode = iOomMonitor.RequestFreeMemory( aRequestAmount ); + if ( errorCode != KErrNone ) + { + // try one more time + PRINT( _L("Camera <> CCamMemoryMonitor::CheckAndRequestMemoryL request returned with error, let's try one more time") ) + errorCode = iOomMonitor.RequestFreeMemory( aRequestAmount ); + } + iOomMonitor.Close(); + + + if ( aShowNote ) + { + note->CancelNoteL(noteId); + CleanupStack::PopAndDestroy( 2 ); // freeMemText & note + } + } + + PRINT1( _L("Camera <= CCamMemoryMonitor::CheckAndRequestMemoryL returning %d"), errorCode ) + return errorCode; + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::CheckAndRequestMemoryL +// --------------------------------------------------------------------------- +// +TInt CCamMemoryMonitor::CheckAndRequestMemoryL( TBool aShowNote ) + { + return CheckAndRequestMemoryL( KCriticalMemoryLevel, KNeededMemoryLevel, aShowNote ); + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::RunL +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::RunL() + { + PRINT( _L("Camera => CCamMemoryMonitor::RunL") ) + iOomMonitor.Close(); + PRINT( _L("Camera <= CCamMemoryMonitor::RunL") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::DoCancel +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::DoCancel() + { + PRINT( _L("Camera => CCamMemoryMonitor::DoCancel") ) + if ( IsActive() ) + { + iOomMonitor.CancelRequestFreeMemory(); + iOomMonitor.Close(); + } + PRINT( _L("Camera <= CCamMemoryMonitor::DoCancel") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::CCamMemoryMonitor +// --------------------------------------------------------------------------- +// +CCamMemoryMonitor::CCamMemoryMonitor(CCamAppUi* aAppUi, CCamAppController* aController) +: CActive( CActive::EPriorityIdle ), + iLimit( KCriticalMemoryLevel ), iRequestAmount( KNeededMemoryLevel ), + iAppUi( aAppUi ), iController( aController ) + + { + PRINT( _L("Camera => CCamMemoryMonitor::CCamMemoryMonitor") ) + CActiveScheduler::Add(this); + PRINT( _L("Camera <= CCamMemoryMonitor::CCamMemoryMonitor") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::ConstructL +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::ConstructL() + { + PRINT( _L("Camera => CCamMemoryMonitor::ConstructL") ) + iMemoryCheckTimer = CPeriodic::New( CActive::EPriorityIdle ); + PRINT( _L("Camera <= CCamMemoryMonitor::ConstructL") ) + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::MemoryCheck +// --------------------------------------------------------------------------- +// +TInt CCamMemoryMonitor::MemoryCheck( TAny* aPtr ) + { + + PRINT( _L("Camera => CCamMemoryMonitor::MemoryCheck") ) + CCamMemoryMonitor* self = static_cast( aPtr ); + + self->CheckMemory(); + + PRINT( _L("Camera <= CCamMemoryMonitor::MemoryCheck") ) + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CCamMemoryMonitor::CheckMemory +// --------------------------------------------------------------------------- +// +void CCamMemoryMonitor::CheckMemory() + { + PRINT( _L("Camera => CCamMemoryMonitor::CheckMemory") ) + if ( IsActive() ) + { + PRINT( _L("Camera <= CCamMemoryMonitor::CheckMemory already requesting memory") ) + return; + } + + if ( iAppUi->CurrentViewState() == ECamViewStatePreCapture && + iController->CurrentOperation() == ECamNoOperation && + !iAppUi->AppInBackground( EFalse ) ) + { + PRINT( _L("Camera <> CCamMemoryMonitor::CheckMemory checking memory") ) + TInt memoryLeft = 0; + HAL::Get( HALData::EMemoryRAMFree, memoryLeft ); + if ( memoryLeft < iLimit ) + { + TInt err = iOomMonitor.Connect(); + if ( !err ) + { + PRINT( _L("Camera <> CCamMemoryMonitor::CheckMemory requesting memory") ) + iOomMonitor.RequestFreeMemory( iRequestAmount, iStatus ); + SetActive(); + } + else + { + PRINT1( _L("Camera <> CCamMemoryMonitor::CheckMemory failed to connect to OoMMonitor err=%d"), err ) + } + } + else + { + PRINT( _L("Camera <> CCamMemoryMonitor::CheckMemory no need for memory request") ) + } + } + else + { + PRINT( _L("Camera <> CCamMemoryMonitor::CheckMemory not in correct state, not checking memory") ) + } + + PRINT( _L("Camera <= CCamMemoryMonitor::CheckMemory") ) + }