From 8489d7c46d4e909db28cf85ffc8ee6b4dea54423 Mon Sep 17 00:00:00 2001
From: Leo Franchi <lfranchi@kde.org>
Date: Tue, 8 Mar 2011 22:43:15 -0500
Subject: [PATCH] make sure to stop (and wait) for script resolvers before
 deleting

---
 src/scriptresolver.cpp | 17 +++++++++++++++++
 src/scriptresolver.h   |  7 +++++--
 src/tomahawkapp.cpp    |  4 ++--
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/scriptresolver.cpp b/src/scriptresolver.cpp
index dddf75a89..01b560098 100644
--- a/src/scriptresolver.cpp
+++ b/src/scriptresolver.cpp
@@ -12,6 +12,7 @@ ScriptResolver::ScriptResolver(const QString& exe) :
     , m_num_restarts( 0 )
     , m_msgsize( 0 )
     , m_ready( false )
+    , m_stopped( false )
 {
     qDebug() << Q_FUNC_INFO << exe;
     connect( &m_proc, SIGNAL(readyReadStandardError()), SLOT(readStderr()) );
@@ -116,6 +117,14 @@ void ScriptResolver::cmdExited(int code, QProcess::ExitStatus status)
     qDebug() << Q_FUNC_INFO << "SCRIPT EXITED, code" << code << "status" << status << m_cmd;
     Tomahawk::Pipeline::instance()->removeResolver( this );
 
+    if( m_stopped ) 
+    {
+        qDebug() << "*** Script resolver stopped ";
+        emit finished();
+        
+        return;
+    }
+    
     if( m_num_restarts < 10 )
     {
         m_num_restarts++;
@@ -154,3 +163,11 @@ void ScriptResolver::doSetup( const QVariantMap& m )
     m_ready = true;
     Tomahawk::Pipeline::instance()->addResolver( this );
 }
+
+void 
+ScriptResolver::stop()
+{
+    m_stopped = true;
+    m_proc.kill();
+}
+
diff --git a/src/scriptresolver.h b/src/scriptresolver.h
index bf7ae163a..5dd4c0902 100644
--- a/src/scriptresolver.h
+++ b/src/scriptresolver.h
@@ -25,9 +25,12 @@ public:
 
     virtual void resolve( const Tomahawk::query_ptr& query );
 
+    void stop();
+    
     QString exe() const { return m_cmd; }
 signals:
-
+    void finished();
+    
 public slots:
 
 private slots:
@@ -47,7 +50,7 @@ private:
     quint32 m_msgsize;
     QByteArray m_msg;
 
-    bool m_ready;
+    bool m_ready, m_stopped;
 
     QJson::Parser m_parser;
     QJson::Serializer m_serializer;
diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp
index 12bda2402..6fffad066 100644
--- a/src/tomahawkapp.cpp
+++ b/src/tomahawkapp.cpp
@@ -407,8 +407,8 @@ TomahawkApp::removeScriptResolver( const QString& path )
     foreach( ScriptResolver* r, m_scriptResolvers ) {
         if( r->exe() == path ) {
             m_scriptResolvers.removeAll( r );
-
-            delete r;
+            connect( r, SIGNAL( finished() ), r, SLOT( deleteLater() ) );
+            r->stop();
             return;
         }
     }