diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- 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() ) {