File indexing completed on 2024-04-14 03:48:52
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011 Dennis Nienhüser <nienhueser@kde.org> 0004 // 0005 0006 #include "jobqueue.h" 0007 #include "logger.h" 0008 0009 #include <QDebug> 0010 #include <QThreadPool> 0011 0012 JobQueue::JobQueue(QObject *parent) : 0013 QObject(parent), m_maxConcurrentJobs(1) 0014 { 0015 // nothing to do 0016 } 0017 0018 void JobQueue::addJob(Job *newJob) 0019 { 0020 QList<Job*> const allJobs = m_jobs + m_runningJobs; 0021 for(Job* job: allJobs) { 0022 if (*job == *newJob) { 0023 qDebug() << "Ignoring job, still running"; 0024 return; 0025 } 0026 } 0027 0028 connect(newJob, SIGNAL(finished(Job*)), this, SLOT(removeJob(Job*))); 0029 0030 if (m_runningJobs.size()<m_maxConcurrentJobs) { 0031 startJob(newJob); 0032 } else { 0033 Logger::instance().setStatus(newJob->region().id() + QLatin1Char('_') + newJob->transport(), newJob->region().name() + QLatin1String(" (") + newJob->transport() + QLatin1Char(')'), "waiting", "Queued."); 0034 m_jobs << newJob; 0035 } 0036 } 0037 0038 void JobQueue::setMaxConcurrentJobs(int size) 0039 { 0040 m_maxConcurrentJobs = size; 0041 } 0042 0043 void JobQueue::removeJob(Job *job) 0044 { 0045 m_runningJobs.removeAll(job); 0046 0047 while (m_runningJobs.size()<m_maxConcurrentJobs && !m_jobs.isEmpty()) { 0048 Job* newJob = m_jobs.first(); 0049 m_jobs.removeFirst(); 0050 startJob(newJob); 0051 } 0052 } 0053 0054 void JobQueue::startJob(Job *job) 0055 { 0056 m_runningJobs << job; 0057 QThreadPool::globalInstance()->start(job); 0058 } 0059 0060 #include "moc_jobqueue.cpp"