File indexing completed on 2024-05-12 15:57:03

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisSharedThreadPoolAdapter.h"
0008 
0009 #include "kis_assert.h"
0010 #include <QThreadPool>
0011 #include <QElapsedTimer>
0012 
0013 
0014 KisSharedThreadPoolAdapter::KisSharedThreadPoolAdapter(QThreadPool *parentPool)
0015     : m_parentPool(parentPool),
0016       m_numRunningJobs(0)
0017 {
0018 }
0019 
0020 KisSharedThreadPoolAdapter::~KisSharedThreadPoolAdapter()
0021 {
0022     waitForDone();
0023     KIS_SAFE_ASSERT_RECOVER_NOOP(!m_numRunningJobs);
0024 }
0025 
0026 void KisSharedThreadPoolAdapter::start(KisSharedRunnable *runnable, int priority)
0027 {
0028     QMutexLocker l(&m_mutex);
0029 
0030     runnable->setSharedThreadPoolAdapter(this);
0031     m_parentPool->start(runnable, priority);
0032 
0033     m_numRunningJobs++;
0034 }
0035 
0036 bool KisSharedThreadPoolAdapter::tryStart(KisSharedRunnable *runnable)
0037 {
0038     QMutexLocker l(&m_mutex);
0039 
0040     runnable->setSharedThreadPoolAdapter(this);
0041     const bool result = m_parentPool->tryStart(runnable);
0042 
0043     if (result) {
0044         m_numRunningJobs++;
0045     }
0046 
0047     return result;
0048 }
0049 
0050 bool KisSharedThreadPoolAdapter::waitForDone(int msecs)
0051 {
0052     QElapsedTimer t;
0053     t.start();
0054 
0055     while (1) {
0056         QMutexLocker l(&m_mutex);
0057 
0058         if (!m_numRunningJobs) break;
0059 
0060         const qint64 elapsed = t.elapsed();
0061         if (msecs >= 0 && msecs < elapsed) return false;
0062 
0063         const unsigned long timeout = msecs < 0 ? ULONG_MAX : msecs - elapsed;
0064 
0065         m_waitCondition.wait(&m_mutex, timeout);
0066     }
0067 
0068     return true;
0069 }
0070 
0071 void KisSharedThreadPoolAdapter::notifyJobCompleted()
0072 {
0073     QMutexLocker l(&m_mutex);
0074 
0075     KIS_SAFE_ASSERT_RECOVER (m_numRunningJobs > 0) {
0076         m_waitCondition.wakeAll();
0077         return;
0078     }
0079 
0080     m_numRunningJobs--;
0081     if (!m_numRunningJobs) {
0082         m_waitCondition.wakeAll();
0083     }
0084 }
0085 
0086