emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp
branchRCL_3
changeset 60 d620048b4810
parent 52 efd4f1afd43e
child 61 dcf0eedfc1a3
--- 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() )
         {