diff -r 50de4d668bb6 -r 82c0024438c8 harvester/common/src/harvestereventmanager.cpp --- a/harvester/common/src/harvestereventmanager.cpp Wed Mar 31 22:19:07 2010 +0300 +++ b/harvester/common/src/harvestereventmanager.cpp Wed Apr 14 16:24:03 2010 +0300 @@ -329,11 +329,10 @@ THarvesterEventQueue* msgQueue = new (ELeave) THarvesterEventQueue; CleanupStack::PushL( msgQueue ); - TInt err = msgQueue->Open( aMessage, 1 ); + User::LeaveIfError( msgQueue->Open( aMessage, 1 ) ); - User::LeaveIfError( err ); - - iEventQueues.AppendL( msgQueue ); + User::LeaveIfError( iEventQueues.InsertInOrderAllowRepeats(msgQueue, + TLinearOrder(CHarvesterEventManager::CompareProperties))); observerInfo->iQueuePtr = msgQueue; CleanupStack::Pop( msgQueue ); @@ -396,17 +395,31 @@ // was the last observer which used it if( !otherObserverFound ) { - for(TInt i = iEventQueues.Count(); --i >= 0;) - { - THarvesterEventQueue* queue = iEventQueues[i]; - if( queue->Handle() == serverQueueHandle ) - { - iEventQueues.Remove( i ); - queue->Close(); - delete queue; - break; - } - } + TInt low( 0 ); + TInt high( iEventQueues.Count() ); + + while( low < high ) + { + TInt mid( (low+high)>>1 ); + + const TInt compare( serverQueueHandle - iEventQueues[mid]->Handle() ); + if( compare == 0 ) + { + THarvesterEventQueue* queue = iEventQueues[mid]; + iEventQueues.Remove( mid ); + queue->Close(); + delete queue; + break; + } + else if( compare > 0 ) + { + low = mid + 1; + } + else + { + high = mid; + } + } iEventQueues.Compress(); } @@ -460,3 +473,9 @@ // deprecated method, just return something return 0; } + +TInt CHarvesterEventManager::CompareProperties(const THarvesterEventQueue& aFirst, const THarvesterEventQueue& aSecond) + { + return aFirst.Handle() - aSecond.Handle(); + } +