void CSearchManager::OnTimer() { QMutexLocker l(&m_pSection); quint32 nSearches = m_lSearches.size(); quint32 nPacketsLeft = PacketsPerSec; if(nSearches == 0) { return; } m_nPruneCounter++; if(m_nPruneCounter % 30 == 0) { HostCache.PruneByQueryAck(); } quint32 nPacketsPerSearch = qMax<quint32>(1, nPacketsLeft / nSearches); quint32 tNow = time(0); quint32 nPacket = 0; bool bUpdate = true; for(QHash<QUuid, CManagedSearch*>::iterator itSearch = m_lSearches.begin(); itSearch != m_lSearches.end() && nPacketsLeft > 0; itSearch++) { CManagedSearch* pSearch = itSearch.value(); if(pSearch->m_nCookie != m_nCookie) { nPacket = nPacketsPerSearch; nPacketsLeft -= nPacket; pSearch->Execute(tNow, &nPacket); pSearch->m_nCookie = m_nCookie; bUpdate = false; nPacketsLeft += nPacket; } pSearch->SendHits(); } if(bUpdate || m_lSearches.size() == 1) { m_nCookie++; } }
void CSearchManager::OnRun() { // Don't run too often to avoid excess CPU use (and router flooding) const DWORD tNow = GetTickCount(); if ( tNow < m_tLastTick + 125 ) return; m_tLastTick = tNow; // Don't run if we aren't connected if ( ! Network.IsWellConnected() ) return; CSingleLock pLock( &m_pSection ); if ( ! pLock.Lock( 120 ) ) return; const int nPriorityFactor[ 3 ] = { 8, 4, 1 }; if ( m_nPriorityCount >= nPriorityFactor[ m_nPriorityClass ] ) { m_nPriorityCount = 0; m_nPriorityClass = ( m_nPriorityClass + 1 ) % CManagedSearch::spMax; } for ( int nClass = 0 ; nClass <= CManagedSearch::spMax ; nClass++ ) { for ( POSITION pos = m_pList.GetHeadPosition() ; pos ; ) { POSITION posCur = pos; CManagedSearch* pSearch = m_pList.GetNext( pos ); if ( pSearch->Execute( m_nPriorityClass ) ) { m_pList.RemoveAt( posCur ); m_pList.AddTail( pSearch ); m_nPriorityCount++; return; } } m_nPriorityCount = 0; m_nPriorityClass = ( m_nPriorityClass + 1 ) % CManagedSearch::spMax; } }