File indexing completed on 2023-09-24 04:08:46
0001 /* 0002 SPDX-FileCopyrightText: 2022 David Faure <faure@kde.org> 0003 SPDX-FileCopyrightText: 2022 Harald Sitter <sitter@kde.org> 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "kiocoredebug.h" 0008 #include "slavebase.h" 0009 #include "workerbase.h" 0010 #include "workerbase_p.h" 0011 #include "workerfactory.h" 0012 #include "workerthread_p.h" 0013 0014 namespace KIO 0015 { 0016 0017 WorkerThread::WorkerThread(QObject *parent, WorkerFactory *factory, const QByteArray &appSocket) 0018 : QThread(parent) 0019 , m_factory(factory) 0020 , m_appSocket(appSocket) 0021 { 0022 } 0023 0024 WorkerThread::~WorkerThread() 0025 { 0026 wait(); 0027 } 0028 0029 void WorkerThread::abort() 0030 { 0031 QMutexLocker locker(&m_workerMutex); 0032 if (m_worker) { // not deleted yet 0033 m_worker->exit(); 0034 } 0035 } 0036 0037 std::variant<std::unique_ptr<KIO::SlaveBase>, std::unique_ptr<KIO::WorkerBase>> makeWorker(const QByteArray &appSocket, WorkerFactory *factory) 0038 { 0039 if (auto workerFactory = qobject_cast<RealWorkerFactory *>(factory)) { 0040 return workerFactory->createRealWorker({}, appSocket); 0041 } 0042 return factory->createWorker({}, appSocket); 0043 } 0044 0045 void WorkerThread::run() 0046 { 0047 qCDebug(KIO_CORE) << QThread::currentThreadId() << "Creating threaded worker"; 0048 0049 auto slaveOrWorker = makeWorker(m_appSocket, m_factory); 0050 SlaveBase *base = nullptr; 0051 if (std::holds_alternative<std::unique_ptr<KIO::WorkerBase>>(slaveOrWorker)) { 0052 auto &worker = std::get<std::unique_ptr<KIO::WorkerBase>>(slaveOrWorker); 0053 base = &(worker->d->bridge); 0054 } else { 0055 Q_ASSERT(std::holds_alternative<std::unique_ptr<KIO::SlaveBase>>(slaveOrWorker)); 0056 base = std::get<std::unique_ptr<KIO::SlaveBase>>(slaveOrWorker).get(); 0057 } 0058 0059 base->setRunInThread(true); 0060 setWorker(base); 0061 0062 base->dispatchLoop(); 0063 0064 setWorker(nullptr); // before the actual deletion 0065 } 0066 0067 void WorkerThread::setWorker(SlaveBase *worker) 0068 { 0069 QMutexLocker locker(&m_workerMutex); 0070 m_worker = worker; 0071 } 0072 0073 } // namespace KIO 0074 0075 #include "moc_workerthread_p.cpp"