summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qeventloop.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-07-03 07:29:29 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-07-04 16:53:15 +0200
commit8c2c4f178a1722fc8c749ca6ee894df151808138 (patch)
tree3b2c67d3667648a14079bc59c5d2f17a723c46e1 /src/corelib/kernel/qeventloop.cpp
parentc70257e9b22226f52caade22b085fb6508fb1ec1 (diff)
QEventLoopLocker: add a visit() member
Still suffers from a bit of an impedance mismatch, because it's the first step in making QEventLoopLocker shed its Private, but will be used in a subsequent commit to DRY more code. Task-number: QTBUG-114793 Pick-to: 6.6 Change-Id: Ia14effb6255961edae68eaf941fece9dca0cb844 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qeventloop.cpp')
-rw-r--r--src/corelib/kernel/qeventloop.cpp34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index 59c93aa6e6..f3ddc84758 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -312,6 +312,7 @@ void QEventLoop::quit()
class QEventLoopLockerPrivate
{
+ friend class QEventLoopLocker;
public:
explicit QEventLoopLockerPrivate(QEventLoopPrivate *loop)
: QEventLoopLockerPrivate(loop, EventLoop)
@@ -331,22 +332,6 @@ public:
app->ref();
}
- ~QEventLoopLockerPrivate()
- {
- switch (type())
- {
- case EventLoop:
- loop()->deref();
- break;
- case Thread:
- thread()->deref();
- break;
- default:
- app()->deref();
- break;
- }
- }
-
private:
QEventLoopPrivate *loop() const { return static_cast<QEventLoopPrivate *>(pointer()); }
QThreadPrivate *thread() const { return static_cast<QThreadPrivate *>(pointer()); }
@@ -432,9 +417,26 @@ QEventLoopLocker::QEventLoopLocker(QThread *thread)
*/
QEventLoopLocker::~QEventLoopLocker()
{
+ visit([](auto p) { p->deref(); });
delete d_ptr;
}
+/*!
+ \internal
+*/
+template <typename Func>
+void QEventLoopLocker::visit(Func f) const
+{
+ using Type = QEventLoopLockerPrivate::Type;
+ const auto ptr = d_ptr->pointer();
+ switch (d_ptr->type()) {
+ case Type::EventLoop: return f(static_cast<QEventLoopPrivate *>(ptr));
+ case Type::Thread: return f(static_cast<QThreadPrivate *>(ptr));
+ case Type::Application: return f(static_cast<QCoreApplicationPrivate *>(ptr));
+ }
+ Q_UNREACHABLE();
+}
+
QT_END_NAMESPACE
#include "moc_qeventloop.cpp"