Ejemplo n.º 1
0
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++;
	}

}
Ejemplo n.º 2
0
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;
	}
}