mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-23 09:19:41 +01:00
* Release unused queries in Pipeline.
This commit is contained in:
parent
4098cc2709
commit
dc5c0394f7
@ -27,6 +27,7 @@
|
||||
|
||||
#define DEFAULT_CONCURRENT_QUERIES 4
|
||||
#define MAX_CONCURRENT_QUERIES 16
|
||||
#define CLEANUP_TIMEOUT 5 * 60 * 1000
|
||||
|
||||
using namespace Tomahawk;
|
||||
|
||||
@ -48,6 +49,9 @@ Pipeline::Pipeline( QObject* parent )
|
||||
|
||||
m_maxConcurrentQueries = qBound( DEFAULT_CONCURRENT_QUERIES, QThread::idealThreadCount(), MAX_CONCURRENT_QUERIES );
|
||||
qDebug() << Q_FUNC_INFO << "Using" << m_maxConcurrentQueries << "threads";
|
||||
|
||||
m_temporaryQueryTimer.setInterval( CLEANUP_TIMEOUT );
|
||||
connect( &m_temporaryQueryTimer, SIGNAL( timeout() ), SLOT( onTemporaryQueryTimer() ) );
|
||||
}
|
||||
|
||||
|
||||
@ -104,7 +108,7 @@ Pipeline::addResolver( Resolver* r )
|
||||
|
||||
|
||||
void
|
||||
Pipeline::resolve( const QList<query_ptr>& qlist, bool prioritized )
|
||||
Pipeline::resolve( const QList<query_ptr>& qlist, bool prioritized, bool temporaryQuery )
|
||||
{
|
||||
{
|
||||
QMutexLocker lock( &m_mut );
|
||||
@ -112,25 +116,24 @@ Pipeline::resolve( const QList<query_ptr>& qlist, bool prioritized )
|
||||
int i = 0;
|
||||
foreach( const query_ptr& q, qlist )
|
||||
{
|
||||
// qDebug() << Q_FUNC_INFO << (qlonglong)q.data() << q->toString();
|
||||
if ( !m_qids.contains( q->id() ) )
|
||||
{
|
||||
m_qids.insert( q->id(), q );
|
||||
}
|
||||
|
||||
if ( m_queries_pending.contains( q ) )
|
||||
{
|
||||
// qDebug() << "Already queued for resolving:" << q->toString();
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( prioritized )
|
||||
{
|
||||
m_queries_pending.insert( i++, q );
|
||||
}
|
||||
else
|
||||
m_queries_pending << q;
|
||||
|
||||
if ( temporaryQuery )
|
||||
{
|
||||
m_queries_pending.append( q );
|
||||
m_queries_temporary << q;
|
||||
|
||||
if ( m_temporaryQueryTimer.isActive() )
|
||||
m_temporaryQueryTimer.stop();
|
||||
m_temporaryQueryTimer.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -140,21 +143,21 @@ Pipeline::resolve( const QList<query_ptr>& qlist, bool prioritized )
|
||||
|
||||
|
||||
void
|
||||
Pipeline::resolve( const query_ptr& q, bool prioritized )
|
||||
Pipeline::resolve( const query_ptr& q, bool prioritized, bool temporaryQuery )
|
||||
{
|
||||
if ( q.isNull() )
|
||||
return;
|
||||
|
||||
QList< query_ptr > qlist;
|
||||
qlist << q;
|
||||
resolve( qlist, prioritized );
|
||||
resolve( qlist, prioritized, temporaryQuery );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Pipeline::resolve( QID qid, bool prioritized )
|
||||
Pipeline::resolve( QID qid, bool prioritized, bool temporaryQuery )
|
||||
{
|
||||
resolve( query( qid ), prioritized );
|
||||
resolve( query( qid ), prioritized, temporaryQuery );
|
||||
}
|
||||
|
||||
|
||||
@ -387,3 +390,18 @@ Pipeline::decQIDState( const Tomahawk::query_ptr& query )
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Pipeline::onTemporaryQueryTimer()
|
||||
{
|
||||
QMutexLocker lock( &m_mut );
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
|
||||
for ( int i = m_queries_temporary.count() - 1; i >= 0; i-- )
|
||||
{
|
||||
query_ptr q = m_queries_temporary.takeAt( i );
|
||||
m_qids.remove( q->id() );
|
||||
qDebug() << "Cleaning up:" << q->toString();
|
||||
}
|
||||
}
|
@ -23,6 +23,7 @@
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
#include <QMutex>
|
||||
#include <QTimer>
|
||||
|
||||
#include "typedefs.h"
|
||||
#include "query.h"
|
||||
@ -65,9 +66,9 @@ public:
|
||||
}
|
||||
|
||||
public slots:
|
||||
void resolve( const query_ptr& q, bool prioritized = false );
|
||||
void resolve( const QList<query_ptr>& qlist, bool prioritized = false );
|
||||
void resolve( QID qid, bool prioritized = false );
|
||||
void resolve( const query_ptr& q, bool prioritized = false, bool temporaryQuery = false );
|
||||
void resolve( const QList<query_ptr>& qlist, bool prioritized = false, bool temporaryQuery = false );
|
||||
void resolve( QID qid, bool prioritized = false, bool temporaryQuery = false );
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
@ -85,6 +86,8 @@ private slots:
|
||||
void shunt( const query_ptr& q );
|
||||
void shuntNext();
|
||||
|
||||
void onTemporaryQueryTimer();
|
||||
|
||||
private:
|
||||
Tomahawk::Resolver* nextResolver( const Tomahawk::query_ptr& query ) const;
|
||||
|
||||
@ -103,8 +106,12 @@ private:
|
||||
|
||||
// store queries here until DB index is loaded, then shunt them all
|
||||
QList< query_ptr > m_queries_pending;
|
||||
// store temporary queries here and clean up after timeout threshold
|
||||
QList< query_ptr > m_queries_temporary;
|
||||
|
||||
int m_maxConcurrentQueries;
|
||||
bool m_running;
|
||||
QTimer m_temporaryQueryTimer;
|
||||
|
||||
static Pipeline* s_instance;
|
||||
};
|
||||
|
@ -33,11 +33,11 @@ using namespace Tomahawk;
|
||||
|
||||
|
||||
query_ptr
|
||||
Query::get( const QString& artist, const QString& track, const QString& album, const QID& qid )
|
||||
Query::get( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve )
|
||||
{
|
||||
query_ptr q = query_ptr( new Query( artist, track, album, qid ) );
|
||||
query_ptr q = query_ptr( new Query( artist, track, album, qid, autoResolve ) );
|
||||
|
||||
if ( !qid.isEmpty() )
|
||||
if ( autoResolve && !qid.isEmpty() )
|
||||
Pipeline::instance()->resolve( q );
|
||||
return q;
|
||||
}
|
||||
@ -54,7 +54,7 @@ Query::get( const QString& query, const QID& qid )
|
||||
}
|
||||
|
||||
|
||||
Query::Query( const QString& artist, const QString& track, const QString& album, const QID& qid )
|
||||
Query::Query( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve )
|
||||
: m_solved( false )
|
||||
, m_playable( false )
|
||||
, m_resolveFinished( false )
|
||||
@ -64,7 +64,7 @@ Query::Query( const QString& artist, const QString& track, const QString& album,
|
||||
, m_track( track )
|
||||
, m_duration( -1 )
|
||||
{
|
||||
if ( !qid.isEmpty() )
|
||||
if ( autoResolve )
|
||||
{
|
||||
connect( Database::instance(), SIGNAL( indexReady() ), SLOT( refreshResults() ), Qt::QueuedConnection );
|
||||
}
|
||||
@ -91,6 +91,12 @@ Query::Query( const QString& query, const QID& qid )
|
||||
}
|
||||
|
||||
|
||||
Query::~Query()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << toString();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Query::addResults( const QList< Tomahawk::result_ptr >& newresults )
|
||||
{
|
||||
|
@ -48,12 +48,14 @@ friend class ::DatabaseCommand_LoadPlaylistEntries;
|
||||
friend class Pipeline;
|
||||
|
||||
public:
|
||||
static query_ptr get( const QString& artist, const QString& track, const QString& album, const QID& qid = QString() );
|
||||
static query_ptr get( const QString& artist, const QString& track, const QString& album, const QID& qid = QString(), bool autoResolve = true );
|
||||
static query_ptr get( const QString& query, const QID& qid );
|
||||
|
||||
explicit Query( const QString& artist, const QString& track, const QString& album, const QID& qid );
|
||||
explicit Query( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve );
|
||||
explicit Query( const QString& query, const QID& qid );
|
||||
|
||||
virtual ~Query();
|
||||
|
||||
/// returns list of all results so far
|
||||
QList< result_ptr > results() const;
|
||||
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
#include <QHash>
|
||||
|
||||
using namespace Tomahawk;
|
||||
|
||||
void
|
||||
Api_v1::auth_1( QxtWebRequestEvent* event, QString arg )
|
||||
{
|
||||
@ -67,7 +69,9 @@ Api_v1::auth_2( QxtWebRequestEvent* event, QString arg )
|
||||
params = params.mid( params.indexOf( '?' ) );
|
||||
QStringList pieces = params.split( '&' );
|
||||
QHash< QString, QString > queryItems;
|
||||
foreach( const QString& part, pieces ) {
|
||||
|
||||
foreach ( const QString& part, pieces )
|
||||
{
|
||||
QStringList keyval = part.split( '=' );
|
||||
if( keyval.size() == 2 )
|
||||
queryItems.insert( keyval.first(), keyval.last() );
|
||||
@ -149,7 +153,7 @@ void
|
||||
Api_v1::sid( QxtWebRequestEvent* event, QString unused )
|
||||
{
|
||||
Q_UNUSED( unused );
|
||||
using namespace Tomahawk;
|
||||
|
||||
RID rid = event->url.path().mid( 5 );
|
||||
qDebug() << "Request for sid " << rid;
|
||||
|
||||
@ -240,7 +244,8 @@ Api_v1::resolve( QxtWebRequestEvent* event )
|
||||
else
|
||||
qid = uuid();
|
||||
|
||||
Tomahawk::query_ptr qry = Tomahawk::Query::get( event->url.queryItemValue( "artist" ), event->url.queryItemValue( "track" ), event->url.queryItemValue( "album" ), qid );
|
||||
query_ptr qry = Query::get( event->url.queryItemValue( "artist" ), event->url.queryItemValue( "track" ), event->url.queryItemValue( "album" ), qid, false );
|
||||
Pipeline::instance()->resolve( qry, true, true );
|
||||
|
||||
QVariantMap r;
|
||||
r.insert( "qid", qid );
|
||||
@ -273,7 +278,6 @@ Api_v1::get_results( QxtWebRequestEvent* event )
|
||||
send404(event);
|
||||
}
|
||||
|
||||
using namespace Tomahawk;
|
||||
query_ptr qry = Pipeline::instance()->query( event->url.queryItemValue( "qid" ) );
|
||||
if( qry.isNull() )
|
||||
{
|
||||
@ -290,7 +294,7 @@ Api_v1::get_results( QxtWebRequestEvent* event )
|
||||
r.insert( "query", qry->toVariant() );
|
||||
|
||||
QVariantList res;
|
||||
foreach( Tomahawk::result_ptr rp, qry->results() )
|
||||
foreach( const result_ptr& rp, qry->results() )
|
||||
{
|
||||
res << rp->toVariant();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user