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