diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 18 | ||||
| -rw-r--r-- | src/corelib/kernel/qcoreevent.cpp | 10 | ||||
| -rw-r--r-- | src/corelib/kernel/qcoreevent.h | 12 | ||||
| -rw-r--r-- | src/corelib/kernel/qcoreevent_p.h | 40 | ||||
| -rw-r--r-- | src/corelib/kernel/qobject.cpp | 1 |
6 files changed, 55 insertions, 28 deletions
diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 164016a208b..a4b654fb5c0 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -152,7 +152,7 @@ qt_internal_add_module(Core kernel/qcoreapplication.cpp kernel/qcoreapplication.h kernel/qcoreapplication_p.h kernel/qcoreapplication_platform.h kernel/qcorecmdlineargs_p.h - kernel/qcoreevent.cpp kernel/qcoreevent.h + kernel/qcoreevent.cpp kernel/qcoreevent.h kernel/qcoreevent_p.h kernel/qdeadlinetimer.cpp kernel/qdeadlinetimer.h kernel/qelapsedtimer.cpp kernel/qelapsedtimer.h kernel/qeventloop.cpp kernel/qeventloop.h kernel/qeventloop_p.h diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 52d0d2ac042..d532875c20f 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -8,6 +8,7 @@ #ifndef QT_NO_QOBJECT #include "qabstracteventdispatcher.h" #include "qcoreevent.h" +#include "qcoreevent_p.h" #include "qeventloop.h" #endif #include "qmetaobject.h" @@ -1660,7 +1661,10 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority) int scopeLevel = data->scopeLevel; if (scopeLevel == 0 && loopLevel != 0) scopeLevel = 1; - static_cast<QDeferredDeleteEvent *>(event)->level = loopLevel + scopeLevel; + + QDeferredDeleteEvent *deleteEvent = static_cast<QDeferredDeleteEvent *>(event); + deleteEvent->m_loopLevel = loopLevel; + deleteEvent->m_scopeLevel = scopeLevel; } // delete the event on exceptions to protect against memory leaks till the event is @@ -1849,13 +1853,15 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type // events posted by the current event loop; or // 3) if the event was posted before the outermost event loop. - int eventLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->loopLevel(); - int loopLevel = data->loopLevel + data->scopeLevel; + const int eventLoopLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->loopLevel(); + const int eventScopeLevel = static_cast<QDeferredDeleteEvent *>(pe.event)->scopeLevel(); + + const bool postedBeforeOutermostLoop = eventLoopLevel == 0; const bool allowDeferredDelete = - (eventLevel > loopLevel - || (!eventLevel && loopLevel > 0) + (eventLoopLevel + eventScopeLevel > data->loopLevel + data->scopeLevel + || (postedBeforeOutermostLoop && data->loopLevel > 0) || (event_type == QEvent::DeferredDelete - && eventLevel == loopLevel)); + && eventLoopLevel + eventScopeLevel == data->loopLevel + data->scopeLevel)); if (!allowDeferredDelete) { // cannot send deferred delete if (!event_type && !receiver) { diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index b01f1c2a699..46398872f7e 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qcoreevent.h" +#include "qcoreevent_p.h" #include "qcoreapplication.h" #include "qcoreapplication_p.h" @@ -637,19 +638,10 @@ Q_IMPL_EVENT_COMMON(QDynamicPropertyChangeEvent) */ QDeferredDeleteEvent::QDeferredDeleteEvent() : QEvent(QEvent::DeferredDelete) - , level(0) { } Q_IMPL_EVENT_COMMON(QDeferredDeleteEvent) -/*! \fn int QDeferredDeleteEvent::loopLevel() const - - Returns the loop-level in which the event was posted. The - loop-level is set by QCoreApplication::postEvent(). - - \sa QObject::deleteLater() -*/ - QT_END_NAMESPACE #include "moc_qcoreevent.cpp" diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index 0c83919bc50..3acaa62a45d 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -395,18 +395,6 @@ private: QByteArray n; }; -class Q_CORE_EXPORT QDeferredDeleteEvent : public QEvent -{ - Q_DECL_EVENT_COMMON(QDeferredDeleteEvent) -public: - explicit QDeferredDeleteEvent(); - int loopLevel() const { return level; } - -private: - int level; - friend class QCoreApplication; -}; - QT_END_NAMESPACE #endif // QCOREEVENT_H diff --git a/src/corelib/kernel/qcoreevent_p.h b/src/corelib/kernel/qcoreevent_p.h new file mode 100644 index 00000000000..edadc013741 --- /dev/null +++ b/src/corelib/kernel/qcoreevent_p.h @@ -0,0 +1,40 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QCOREEVENT_P_H +#define QCOREEVENT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "QtCore/qcoreevent.h" + +QT_BEGIN_NAMESPACE + +class QCoreApplication; + +class Q_AUTOTEST_EXPORT QDeferredDeleteEvent : public QEvent +{ + Q_DECL_EVENT_COMMON(QDeferredDeleteEvent) +public: + explicit QDeferredDeleteEvent(); + int loopLevel() const { return m_loopLevel; } + int scopeLevel() const { return m_scopeLevel; } + +private: + int m_loopLevel = 0; + int m_scopeLevel = 0; + friend class QCoreApplication; +}; + +QT_END_NAMESPACE + +#endif // QCOREEVENT_P_H diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 2fc3d768981..873d3daeca0 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -12,6 +12,7 @@ #include "qabstracteventdispatcher_p.h" #include "qcoreapplication.h" #include "qcoreapplication_p.h" +#include "qcoreevent_p.h" #include "qloggingcategory.h" #include "qvariant.h" #include "qmetaobject.h" |
