SignalDumper: fix UB (data race on indentation level)

... by making it thread_local.

As a natural (and welcome) side-effect, this makes output look sane in
multithreaded scenarios.

As for why it should be thread_local instead of an atomic:
Since signal emissions and slot invocations on one thread are not
necessarily correlated with another thread, they should not affect
one another's indentation level. As in, emitting QIODevice::readyRead
on a background thread should not make QEventLoop::aboutToBlock on the
main thread be indented. The only exception to this is BlockingQueued,
where one thread is directly tied to another (QTBUG-118145). But slot
invocations are anyway not currently printed for Queued connection
(see QTBUG-74099.)

Pick-to: 6.5
Change-Id: Iea1fc522d37626df14af419a3455a732729edf74
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
(cherry picked from commit ae0d231c96ab93ec36c7202c268507314eb40116)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Mårten Nordheim 2023-10-02 16:31:50 +02:00 committed by Qt Cherry-pick Bot
parent 19471b215d
commit 41feba789e

View File

@ -24,7 +24,7 @@ inline static void qPrintMessage(const QByteArray &ba)
}
Q_GLOBAL_STATIC(QList<QByteArray>, ignoreClasses)
static int iLevel = 0;
Q_CONSTINIT thread_local int iLevel = 0;
static int ignoreLevel = 0;
enum { IndentSpacesCount = 4 };