Ticket #11663: 0001-Ensure-cancelling-a-download-is-done-in-the-same-thr.patch

File 0001-Ensure-cancelling-a-download-is-done-in-the-same-thr.patch, 3.9 KB (added by JYA, 11 years ago)

Fixes for crash

  • mythtv/libs/libmythbase/mythdownloadmanager.cpp

    From 194d0c5c2729bc608a6629f62ac1cc6752a75b52 Mon Sep 17 00:00:00 2001
    From: Jean-Yves Avenard <jyavenard@mythtv.org>
    Date: Fri, 12 Jul 2013 01:16:52 +1000
    Subject: [PATCH] Ensure cancelling a download is done in the same thread it
     started
    
    This prevent Qt to crash with "Cannot send events to objects owned by a different thread."
    
    Fixes #11663
    ---
     mythtv/libs/libmythbase/mythdownloadmanager.cpp | 24 ++++++++++++++++++++++--
     mythtv/libs/libmythbase/mythdownloadmanager.h   | 21 +++++++++++++++++++++
     2 files changed, 43 insertions(+), 2 deletions(-)
    
    diff --git a/mythtv/libs/libmythbase/mythdownloadmanager.cpp b/mythtv/libs/libmythbase/mythdownloadmanager.cpp
    index b782cf0..d5081e9 100644
    a b bool MythDownloadManager::downloadNow(MythDownloadInfo *dlInfo, bool deleteInfo) 
    856856 */
    857857void MythDownloadManager::cancelDownload(const QString &url)
    858858{
     859    CancelDownloadRequest *req = new CancelDownloadRequest(url);
     860    connect(req, SIGNAL(cancelDownloadRequest(QString)),
     861            this, SLOT(processCancelDownload(QString)));
     862    // will emit signal as soon as event loop is ready
     863    MThreadPool::globalInstance()->start(req, "CancelRequest");
     864}
     865
     866void MythDownloadManager::processCancelDownload(QString url)
     867{
    859868    QMutexLocker locker(m_infoLock);
    860869    MythDownloadInfo *dlInfo;
    861870
    void MythDownloadManager::cancelDownload(const QString &url) 
    869878            // this shouldn't happen
    870879            if (dlInfo->m_reply)
    871880            {
    872                 LOG(VB_FILE, LOG_DEBUG, 
     881                LOG(VB_FILE, LOG_DEBUG,
    873882                    LOC + QString("Aborting download - user request"));
    874883                dlInfo->m_reply->abort();
    875884            }
    void MythDownloadManager::cancelDownload(const QString &url) 
    886895        dlInfo = m_downloadInfos[url];
    887896        if (dlInfo->m_reply)
    888897        {
    889             LOG(VB_FILE, LOG_DEBUG, 
     898            LOG(VB_FILE, LOG_DEBUG,
    890899                LOC + QString("Aborting download - user request"));
    891900            m_downloadReplies.remove(dlInfo->m_reply);
    892901            dlInfo->m_reply->abort();
    void MythCookieJar::save(const QString &filename) 
    15711580    }
    15721581}
    15731582
     1583/** \brief CancelDownloadRequest Constructor
     1584 *  \param url URL download to cancel
     1585 */
     1586CancelDownloadRequest::CancelDownloadRequest(const QString &url) : m_url(url)
     1587{
     1588}
     1589
     1590void CancelDownloadRequest::run(void)
     1591{
     1592    emit cancelDownloadRequest(m_url);
     1593}
    15741594
    15751595/* vim: set expandtab tabstop=4 shiftwidth=4: */
    15761596
  • mythtv/libs/libmythbase/mythdownloadmanager.h

    diff --git a/mythtv/libs/libmythbase/mythdownloadmanager.h b/mythtv/libs/libmythbase/mythdownloadmanager.h
    index 00733a9..58bf318 100644
    a b  
    1111#include <QWaitCondition>
    1212#include <QString>
    1313#include <QHash>
     14#include <QRunnable>
    1415
    1516#include "mythbaseexp.h"
    1617#include "mthread.h"
    class MBASE_PUBLIC MythDownloadManager : public QObject, public MThread 
    9293    // QNetworkAccessManager signals
    9394    void downloadFinished(QNetworkReply* reply);
    9495    void authCallback(QNetworkReply *reply, QAuthenticator *authenticator);
     96    void processCancelDownload(QString m_url);
    9597
    9698    // QNetworkReply signals
    9799    void downloadError(QNetworkReply::NetworkError errorCode);
    class MBASE_PUBLIC MythDownloadManager : public QObject, public MThread 
    152154
    153155 MBASE_PUBLIC  MythDownloadManager *GetMythDownloadManager(void);
    154156
     157/**
     158 * \class CancelDownloadRequest
     159 */
     160class CancelDownloadRequest : public QObject, public QRunnable
     161{
     162    Q_OBJECT
     163
     164  public:
     165    CancelDownloadRequest(const QString &url);
     166
     167    void run();
     168
     169  signals:
     170    void cancelDownloadRequest(QString);
     171
     172  private:
     173    QString m_url;
     174};
     175
    155176#endif
    156177
    157178/* vim: set expandtab tabstop=4 shiftwidth=4: */