bool PipelineElement::visit( QList< PipelineElement* >& ordering, QSet< PipelineElement* >& visited ) { // check if this node is already in partial ordering if( ordering.contains( this )) return true; // check for cycles if( visited.contains( this )) { // cycle detected ordering.append( this ); return false; } visited.insert( this ); // visit all incoming connections for( PipelineElement::InputPinMap::const_iterator itr = m_inputPins.begin(); itr!=m_inputPins.end(); ++itr ) { IInputPin* inputPin = itr->second; if( inputPin->isConnected() ) { PipelineElement* node = inputPin->getConnection()->fromPin()->getOwner(); // directly quit if cycle detected if( !node->visit( ordering, visited ) ) return false; } } // go up in call stack visited.remove( this ); ordering.append( this ); return true; }
int PipelineElement::maxInputQueueSize() const { QMutexLocker lock( &m_pleMutex ); int maxQueueSize = 0; for( PipelineElement::InputPinMap::const_iterator itr = m_inputPins.begin(); itr!=m_inputPins.end(); ++itr ) { int queueSize = 0; IInputPin* inputPin = itr->second; if( inputPin->isConnected() ) { queueSize = inputPin->getConnection()->size(); } if( queueSize > maxQueueSize ) maxQueueSize = queueSize; } return maxQueueSize; }