diff options
Diffstat (limited to 'src/corelib/kernel/qeventloop.cpp')
-rw-r--r-- | src/corelib/kernel/qeventloop.cpp | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp index 8b0ec85679..dfdd178c35 100644 --- a/src/corelib/kernel/qeventloop.cpp +++ b/src/corelib/kernel/qeventloop.cpp @@ -322,28 +322,51 @@ class QEventLoopLockerPrivate { public: explicit QEventLoopLockerPrivate(QEventLoopPrivate *loop) - : loop(loop), app(0) + : loop(loop), type(EventLoop) { loop->ref(); } + explicit QEventLoopLockerPrivate(QThreadPrivate *thread) + : thread(thread), type(Thread) + { + thread->ref(); + } + explicit QEventLoopLockerPrivate(QCoreApplicationPrivate *app) - : loop(0), app(app) + : app(app), type(Application) { app->ref(); } ~QEventLoopLockerPrivate() { - if (loop) + switch (type) + { + case EventLoop: loop->deref(); - else + break; + case Thread: + thread->deref(); + break; + default: app->deref(); + break; + } } private: - QEventLoopPrivate *loop; - QCoreApplicationPrivate *app; + union { + QEventLoopPrivate * loop; + QThreadPrivate * thread; + QCoreApplicationPrivate * app; + }; + enum Type { + EventLoop, + Thread, + Application + }; + const Type type; }; /*! @@ -390,6 +413,12 @@ QEventLoopLocker::QEventLoopLocker(QEventLoop *loop) } +QEventLoopLocker::QEventLoopLocker(QThread *thread) + : d_ptr(new QEventLoopLockerPrivate(static_cast<QThreadPrivate*>(QObjectPrivate::get(thread)))) +{ + +} + /*! Destroys this event loop locker object */ |