--- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Mon Jun 21 15:20:54 2010 +0300
+++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Thu Jul 15 18:19:25 2010 +0300
@@ -1232,8 +1232,12 @@
}
}
- // if iNewMailIds is not empty - start timer
- if ( !iNewMailTimer->IsActive() && iNewMailIds.Count() )
+ // start timer only when all conditions are met:
+ // timer isn`t already active
+ // there are new mails in the array
+ // timer event isn`t processing
+ if ( !iNewMailTimer->IsActive() && iNewMailIds.Count() &&
+ iNewMailTimer->iStatus != KErrInUse )
{
iNewMailTimer->Start( KNewMailTimerDelay );
}
@@ -1251,6 +1255,12 @@
TInt count = Min( KNewMailMaxBatch, iNewMailIds.Count() );
CFSMailClient* mailClient = iAppUi.GetMailClient();
+ // Enter critical section
+ // Because CFSMailClient::GetMessageByUidL can use CActiveSchedulerWait
+ // to ensure that only one TimerEventL method is processed at time
+ // CFSEmailUiGenericTimer`s iStatus will be used as mutex
+ iNewMailTimer->iStatus = KErrInUse;
+
for ( TInt i = 0; i < count; i++ )
{
CFSMailMessage* msgPtr = mailClient->GetMessageByUidL( iAppUi.GetActiveMailboxId(),
@@ -1270,6 +1280,9 @@
iNewMailIds.Remove( 0 );
}
+ // End critical section
+ iNewMailTimer->iStatus = KErrNone;
+
// if timer stoped then restart if more messages available
if ( iNewMailIds.Count() && ! iNewMailTimer->IsActive() )
{