summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-12-21 11:01:43 -0300
committerThiago Macieira <thiago.macieira@intel.com>2025-01-06 17:48:27 -0300
commit357351b7ab8ab2eee865d2449ffcca9c9f502fd3 (patch)
tree7eac20eda61fe3724e202c851e1cf8e89cf8863e
parent314a5b972646a4f2ef9c1f49ddfd335f546336ab (diff)
Revert "Add categorized logging of delete later machinery"
This reverts commit c3a2b9f35a9a12ff3c6f5f0d11844de161b47c2a. Unfortunately, some of the log messages happen WAY too late at process exit time, when QtCore is unloading. In particular, the worst offender is the one in QThreadPrivate::finish(), which is called after the last QObject in the thread that called ::exit() was getting destroyed. This implies we have Static (De)Initialization Order Fiascos happening (the logging recurses into qlocale.cpp and the defaultLocalePrivate global static has already been destroyed). I need to revert this commit in order to fix QThreadData destruction. The functionality is welcome back in QtCore once the fixes are in, so long as whoever does it fixes the issues we're seeing in the CI (and I can't reproduce on my development machine). I've created QTBUG-132429 to track the reversal and see if the functionality can be brought back in. Task-number: QTBUG-120124 Task-number: QTBUG-132429 Pick-to: 6.9 6.8 Change-Id: Iecf8f14529c7a2bb2185fffdfd328066098826b1 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp45
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h5
-rw-r--r--src/corelib/kernel/qeventloop.cpp9
-rw-r--r--src/corelib/kernel/qobject.cpp13
-rw-r--r--src/corelib/kernel/qtranslator.cpp1
-rw-r--r--src/corelib/thread/qthread.cpp15
-rw-r--r--src/corelib/thread/qthread_p.h7
-rw-r--r--src/corelib/thread/qthread_unix.cpp2
-rw-r--r--src/corelib/thread/qthread_win.cpp1
9 files changed, 17 insertions, 81 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 6d860bc1e7c..635c69912b1 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -115,10 +115,6 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_QOBJECT
-Q_LOGGING_CATEGORY(lcDeleteLater, "qt.core.qobject.deletelater")
-#endif
-
using namespace Qt::StringLiterals;
Q_TRACE_PREFIX(qtcore,
@@ -1481,8 +1477,6 @@ void QCoreApplicationPrivate::execCleanup()
{
threadData.loadRelaxed()->quitNow = false;
in_exec = false;
-
- qCDebug(lcDeleteLater) << "Sending deferred delete events as part of exec cleanup";
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
}
@@ -1853,37 +1847,16 @@ 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.
- const auto *event = static_cast<QDeferredDeleteEvent *>(pe.event);
- qCDebug(lcDeleteLater) << "Processing deferred delete event for" << pe.receiver
- << "with loop level" << event->loopLevel() << "and scope level" << event->scopeLevel();
-
- qCDebug(lcDeleteLater) << "Checking" << data->thread << "with loop level"
- << data->loopLevel << "and scope level" << data->scopeLevel;
-
- bool allowDeferredDelete = false;
- if (event->loopLevel() == 0 && data->loopLevel > 0) {
- qCDebug(lcDeleteLater) << "Event was posted outside outermost event loop"
- << "and current thread has an event loop running.";
- allowDeferredDelete = true;
- } else {
- const int totalEventLevel = event->loopLevel() + event->scopeLevel();
- const int totalThreadLevel = data->loopLevel + data->scopeLevel;
-
- if (totalEventLevel > totalThreadLevel) {
- qCDebug(lcDeleteLater) << "Combined levels of event" << totalEventLevel
- << "is higher than thread" << totalThreadLevel;
- allowDeferredDelete = true;
- } else if (event_type == QEvent::DeferredDelete && totalEventLevel == totalThreadLevel) {
- qCDebug(lcDeleteLater) << "Explicit send of DeferredDelete and"
- << "levels of event" << totalEventLevel
- << "is same as thread" << totalThreadLevel;
- allowDeferredDelete = true;
- }
- }
+ 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 =
+ (eventLoopLevel + eventScopeLevel > data->loopLevel + data->scopeLevel
+ || (postedBeforeOutermostLoop && data->loopLevel > 0)
+ || (event_type == QEvent::DeferredDelete
+ && eventLoopLevel + eventScopeLevel == data->loopLevel + data->scopeLevel));
if (!allowDeferredDelete) {
- qCDebug(lcDeleteLater) << "Failed conditions for deferred delete. Deferring again";
-
// cannot send deferred delete
if (!event_type && !receiver) {
// we must copy it first; we want to re-post the event
@@ -1900,8 +1873,6 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
data->postEventList.addEvent(pe_copy);
}
continue;
- } else {
- qCDebug(lcDeleteLater) << "Sending deferred delete to" << pe.receiver;
}
}
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index a1e0e4d560a..ed18df4e72f 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -25,7 +25,6 @@
#include "QtCore/qsettings.h"
#endif
#ifndef QT_NO_QOBJECT
-#include <qloggingcategory.h>
#include "private/qobject_p.h"
#include "private/qlocking_p.h"
#endif
@@ -36,10 +35,6 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_QOBJECT
-Q_DECLARE_LOGGING_CATEGORY(lcDeleteLater)
-#endif
-
typedef QList<QTranslator*> QTranslatorList;
class QAbstractEventDispatcher;
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index 500b67ea6ae..c02afd172dc 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -155,9 +155,6 @@ int QEventLoop::exec(ProcessEventsFlags flags)
auto threadData = d->threadData.loadRelaxed();
++threadData->loopLevel;
threadData->eventLoops.push(d->q_func());
- qCDebug(lcDeleteLater) << "Increased" << threadData->thread
- << "loop level to" << threadData->loopLevel
- << "with leaf loop now" << threadData->eventLoops.last();
locker.unlock();
}
@@ -176,12 +173,6 @@ int QEventLoop::exec(ProcessEventsFlags flags)
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
--threadData->loopLevel;
-
- qCDebug(lcDeleteLater) << "Decreased" << threadData->thread
- << "loop level to" << threadData->loopLevel
- << "with leaf loop now" << (threadData->eventLoops.isEmpty()
- ? nullptr : threadData->eventLoops.last());
-
}
};
LoopReference ref(d, locker);
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 7c179c4bde5..2a419aabf8e 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -1413,7 +1413,6 @@ bool QObject::event(QEvent *e)
break;
case QEvent::DeferredDelete:
- qCDebug(lcDeleteLater) << "Deferred deleting" << this;
delete this;
break;
@@ -2464,10 +2463,8 @@ void QObject::deleteLater()
// as long as we're not guarding every access to the bit field.
Q_D(QObject);
- if (d->deleteLaterCalled) {
- qCDebug(lcDeleteLater) << "Skipping deleteLater for already deferred object" << this;
+ if (d->deleteLaterCalled)
return;
- }
d->deleteLaterCalled = true;
@@ -2493,16 +2490,10 @@ void QObject::deleteLater()
// non-conformant code path, and our best guess is that the scope level
// should be 1. (Loop level 0 is special: it means that no event loops
// are running.)
- if (scopeLevel == 0 && loopLevel != 0) {
- qCDebug(lcDeleteLater) << "Delete later called with scope level 0"
- << "but loop level is > 0. Assuming scope is 1";
+ if (scopeLevel == 0 && loopLevel != 0)
scopeLevel = 1;
- }
}
- qCDebug(lcDeleteLater) << "Posting deferred delete for" << this
- << "with loop level" << loopLevel << "and scope level" << scopeLevel;
-
eventListLocker.unlock();
QCoreApplication::postEvent(this,
new QDeferredDeleteEvent(loopLevel, scopeLevel));
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index f3846e38c23..713c029c347 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -19,6 +19,7 @@
#include "qtranslator_p.h"
#include "qlocale.h"
#include "qlogging.h"
+#include "qloggingcategory.h"
#include "qdebug.h"
#include "qendian.h"
#include "qresource.h"
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 08e8368043e..b5b4618e0bd 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -131,21 +131,6 @@ void QAdoptedThread::run()
}
#endif
-QScopedScopeLevelCounter::QScopedScopeLevelCounter(QThreadData *threadData)
- : threadData(threadData)
-{
- ++threadData->scopeLevel;
- qCDebug(lcDeleteLater) << "Increased" << threadData->thread
- << "scope level to" << threadData->scopeLevel;
-}
-
-QScopedScopeLevelCounter::~QScopedScopeLevelCounter()
-{
- --threadData->scopeLevel;
- qCDebug(lcDeleteLater) << "Decreased" << threadData->thread
- << "scope level to" << threadData->scopeLevel;
-}
-
#if QT_CONFIG(thread)
/*
QThreadPrivate
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index eb721509776..547c2867f16 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -379,8 +379,11 @@ class QScopedScopeLevelCounter
{
QThreadData *threadData;
public:
- QScopedScopeLevelCounter(QThreadData *threadData);
- ~QScopedScopeLevelCounter();
+ inline QScopedScopeLevelCounter(QThreadData *threadData)
+ : threadData(threadData)
+ { ++threadData->scopeLevel; }
+ inline ~QScopedScopeLevelCounter()
+ { --threadData->scopeLevel; }
};
// thread wrapper for the main() thread
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index fc9ab3aa1a6..15851a6046b 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -8,6 +8,7 @@
#include <private/qcoreapplication_p.h>
#include <private/qcore_unix_p.h>
#include "qdebug.h"
+#include "qloggingcategory.h"
#include "qthreadstorage.h"
#include <private/qtools_p.h>
@@ -404,7 +405,6 @@ void QThreadPrivate::finish()
d->threadState = QThreadPrivate::Finishing;
locker.unlock();
emit thr->finished(QThread::QPrivateSignal());
- qCDebug(lcDeleteLater) << "Sending deferred delete events as part of finishing thread" << thr;
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
void *data = &d->data->tls;
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index 8b902ec2cd6..137a609107a 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -230,7 +230,6 @@ void QThreadPrivate::finish(bool lockAnyway) noexcept
if (lockAnyway)
locker.unlock();
emit thr->finished(QThread::QPrivateSignal());
- qCDebug(lcDeleteLater) << "Sending deferred delete events as part of finishing thread" << thr;
QCoreApplicationPrivate::sendPostedEvents(nullptr, QEvent::DeferredDelete, d->data);
QThreadStorageData::finish(tls_data);
if (lockAnyway)