File indexing completed on 2024-05-05 16:13:29

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"