Remove unnecessary ref-counting of QRunnable

It could never be higher than 1 anyway.

Change-Id: If33c7978a4397a08e9eb091926726725d8bd3ea6
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
This commit is contained in:
Allan Sandfeld Jensen 2020-10-01 10:40:47 +02:00
parent 4940f6d04c
commit ecfda98d1f
2 changed files with 7 additions and 32 deletions

View File

@ -47,21 +47,18 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QRunnable
{
int ref; // Qt6: Make this a bool, or make autoDelete() virtual.
bool m_autoDelete = true;
friend class QThreadPool;
friend class QThreadPoolPrivate;
friend class QThreadPoolThread;
Q_DISABLE_COPY(QRunnable)
public:
virtual void run() = 0;
QRunnable() : ref(0) { }
constexpr QRunnable() noexcept = default;
virtual ~QRunnable();
static QRunnable *create(std::function<void()> functionToRun);
bool autoDelete() const { return ref != -1; }
void setAutoDelete(bool _autoDelete) { ref = _autoDelete ? 0 : -1; }
bool autoDelete() const { return m_autoDelete; }
void setAutoDelete(bool autoDelete) { m_autoDelete = autoDelete; }
};
QT_END_NAMESPACE

View File

@ -88,9 +88,8 @@ void QThreadPoolThread::run()
do {
if (r) {
// If autoDelete() is false, r might already be deleted after run(), so check status now.
const bool del = r->autoDelete();
Q_ASSERT(!del || r->ref == 1);
// run the task
locker.unlock();
@ -330,7 +329,6 @@ void QThreadPoolPrivate::clear()
while (!page->isFinished()) {
QRunnable *r = page->pop();
if (r && r->autoDelete()) {
Q_ASSERT(r->ref == 1);
locker.unlock();
delete r;
locker.relock();
@ -371,10 +369,6 @@ bool QThreadPool::tryTake(QRunnable *runnable)
d->queue.removeOne(page);
delete page;
}
if (runnable->autoDelete()) {
Q_ASSERT(runnable->ref == 1);
--runnable->ref; // undo ++ref in start()
}
return true;
}
}
@ -393,14 +387,13 @@ void QThreadPoolPrivate::stealAndRunRunnable(QRunnable *runnable)
Q_Q(QThreadPool);
if (!q->tryTake(runnable))
return;
// If autoDelete() is false, runnable might already be deleted after run(), so check status now.
const bool del = runnable->autoDelete();
runnable->run();
if (del) {
Q_ASSERT(runnable->ref == 0); // tryTake already deref'ed
if (del)
delete runnable;
}
}
/*!
@ -508,10 +501,6 @@ void QThreadPool::start(QRunnable *runnable, int priority)
Q_D(QThreadPool);
QMutexLocker locker(&d->mutex);
if (runnable->autoDelete()) {
Q_ASSERT(runnable->ref == 0);
++runnable->ref;
}
if (!d->tryStart(runnable)) {
d->enqueueTask(runnable, priority);
@ -558,22 +547,11 @@ bool QThreadPool::tryStart(QRunnable *runnable)
if (!runnable)
return false;
if (runnable->autoDelete()) {
Q_ASSERT(runnable->ref == 0);
++runnable->ref;
}
Q_D(QThreadPool);
QMutexLocker locker(&d->mutex);
if (d->tryStart(runnable))
return true;
// Undo the reference above as we did not start the runnable and
// take over ownership.
if (runnable->autoDelete()) {
--runnable->ref;
Q_ASSERT(runnable->ref == 0);
}
return false;
}