From 705d29585b9a006b2fc8dd77ebf7a67b3670011b Mon Sep 17 00:00:00 2001 From: "M. Moellney" Date: Sat, 19 Mar 2016 22:00:32 +0100 Subject: Fix qSetMessagePattern to have many time/backtrace parts The previous implementation overwrote multiple 'time' parts in the qSetMessagePattern with the last setting in the pattern line. %{time}%{time process}%{time boot} ended up to be output as if %{time boot}%{time boot}%{time boot} was set. This fix keeps the arguments of each individual 'time' part. The same holds for multiple 'backtrace' parts. The previouse implementation overwrote multiple 'backtrace' arguments with the arguments of the last occurrence. This fix keeps the individual arguments for the 'process' parts. The individual arguments are applied in qFormatLogMessage. A new test to verify the individual 'time' arguments application is added, too. Task-number: QTBUG-51944 Change-Id: Ib757614a482c5f31ed0a61b550daa2eea4b907b4 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/global/qlogging.cpp | 69 +++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 20 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index dcac9a16a4..86b9597609 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -980,13 +980,16 @@ struct QMessagePattern { // 0 terminated arrays of literal tokens / literal or placeholder tokens const char **literals; const char **tokens; - QString timeFormat; + QList timeArgs; // timeFormats in sequence of %{time #ifndef QT_BOOTSTRAPPED QElapsedTimer timer; #endif #ifdef QLOGGING_HAVE_BACKTRACE - QString backtraceSeparator; - int backtraceDepth; + struct BacktraceParams { + QString backtraceSeparator; + int backtraceDepth; + }; + QList backtraceArgs; // backtrace argumens in sequence of %{backtrace #endif bool fromEnvironment; @@ -998,10 +1001,6 @@ QBasicMutex QMessagePattern::mutex; QMessagePattern::QMessagePattern() : literals(0) , tokens(0) -#ifdef QLOGGING_HAVE_BACKTRACE - , backtraceSeparator(QLatin1Char('|')) - , backtraceDepth(5) -#endif , fromEnvironment(false) { #ifndef QT_BOOTSTRAPPED @@ -1104,10 +1103,14 @@ void QMessagePattern::setPattern(const QString &pattern) tokens[i] = timeTokenC; int spaceIdx = lexeme.indexOf(QChar::fromLatin1(' ')); if (spaceIdx > 0) - timeFormat = lexeme.mid(spaceIdx + 1, lexeme.length() - spaceIdx - 2); + timeArgs.append(lexeme.mid(spaceIdx + 1, lexeme.length() - spaceIdx - 2)); + else + timeArgs.append(QString()); } else if (lexeme.startsWith(QLatin1String(backtraceTokenC))) { #ifdef QLOGGING_HAVE_BACKTRACE tokens[i] = backtraceTokenC; + QString backtraceSeparator = QStringLiteral("|"); + int backtraceDepth = 5; QRegularExpression depthRx(QStringLiteral(" depth=(?|\"([^\"]*)\"|([^ }]*))")); QRegularExpression separatorRx(QStringLiteral(" separator=(?|\"([^\"]*)\"|([^ }]*))")); QRegularExpressionMatch m = depthRx.match(lexeme); @@ -1121,6 +1124,10 @@ void QMessagePattern::setPattern(const QString &pattern) m = separatorRx.match(lexeme); if (m.hasMatch()) backtraceSeparator = m.captured(1); + BacktraceParams backtraceParams; + backtraceParams.backtraceDepth = backtraceDepth; + backtraceParams.backtraceSeparator = backtraceSeparator; + backtraceArgs.append(backtraceParams); #else error += QStringLiteral("QT_MESSAGE_PATTERN: %{backtrace} is not supported by this Qt build\n"); #endif @@ -1263,13 +1270,29 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con bool skip = false; +#ifndef QT_BOOTSTRAPPED + int timeArgsIdx = 0; +#ifdef QLOGGING_HAVE_BACKTRACE + int backtraceArgsIdx = 0; +#endif +#endif + // we do not convert file, function, line literals to local encoding due to overhead for (int i = 0; pattern->tokens[i] != 0; ++i) { const char *token = pattern->tokens[i]; if (token == endifTokenC) { skip = false; } else if (skip) { - // do nothing + // we skip adding messages, but we have to iterate over + // timeArgsIdx and backtraceArgsIdx anyway +#ifndef QT_BOOTSTRAPPED + if (token == timeTokenC) + timeArgsIdx++; +#ifdef QLOGGING_HAVE_BACKTRACE + else if (token == backtraceTokenC) + backtraceArgsIdx++; +#endif +#endif } else if (token == messageTokenC) { message.append(str); } else if (token == categoryTokenC) { @@ -1307,11 +1330,15 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con message.append(QString::number(qlonglong(QThread::currentThread()->currentThread()), 16)); #ifdef QLOGGING_HAVE_BACKTRACE } else if (token == backtraceTokenC) { - QVarLengthArray buffer(7 + pattern->backtraceDepth); + QMessagePattern::BacktraceParams backtraceParams = pattern->backtraceArgs.at(backtraceArgsIdx); + QString backtraceSeparator = backtraceParams.backtraceSeparator; + int backtraceDepth = backtraceParams.backtraceDepth; + backtraceArgsIdx++; + QVarLengthArray buffer(7 + backtraceDepth); int n = backtrace(buffer.data(), buffer.size()); if (n > 0) { int numberPrinted = 0; - for (int i = 0; i < n && numberPrinted < pattern->backtraceDepth; ++i) { + for (int i = 0; i < n && numberPrinted < backtraceDepth; ++i) { QScopedPointer strings(backtrace_symbols(buffer.data() + i, 1)); QString trace = QString::fromLatin1(strings.data()[0]); // The results of backtrace_symbols looks like this: @@ -1341,7 +1368,7 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con } if (numberPrinted > 0) - message.append(pattern->backtraceSeparator); + message.append(backtraceSeparator); if (function.isEmpty()) { if (numberPrinted == 0 && context.function) @@ -1355,27 +1382,29 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con } else { if (numberPrinted == 0) continue; - message += pattern->backtraceSeparator + QLatin1String("???"); + message += backtraceSeparator + QLatin1String("???"); } numberPrinted++; } } #endif } else if (token == timeTokenC) { - if (pattern->timeFormat == QLatin1String("process")) { - quint64 ms = pattern->timer.elapsed(); - message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000))); - } else if (pattern->timeFormat == QLatin1String("boot")) { + QString timeFormat = pattern->timeArgs.at(timeArgsIdx); + timeArgsIdx++; + if (timeFormat == QLatin1String("process")) { + quint64 ms = pattern->timer.elapsed(); + message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000))); + } else if (timeFormat == QLatin1String("boot")) { // just print the milliseconds since the elapsed timer reference // like the Linux kernel does QElapsedTimer now; now.start(); uint ms = now.msecsSinceReference(); message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000))); - } else if (pattern->timeFormat.isEmpty()) { - message.append(QDateTime::currentDateTime().toString(Qt::ISODate)); + } else if (timeFormat.isEmpty()) { + message.append(QDateTime::currentDateTime().toString(Qt::ISODate)); } else { - message.append(QDateTime::currentDateTime().toString(pattern->timeFormat)); + message.append(QDateTime::currentDateTime().toString(timeFormat)); } #endif } else if (token == ifCategoryTokenC) { -- cgit v1.2.3 From 215a04d51ac7e609588fc7b7f0d21aedf6140a87 Mon Sep 17 00:00:00 2001 From: Lorenz Haas Date: Fri, 25 Mar 2016 12:19:03 +0100 Subject: Fix debug message to match the method's name Change-Id: Ieaf7366663beeecec3240353d045fb19e2ae99ee Reviewed-by: Louai Al-Khanji --- src/corelib/io/qprocess_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/corelib') diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index 18d203404d..df13a2533e 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -640,7 +640,7 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen) void QProcessPrivate::terminateProcess() { #if defined (QPROCESS_DEBUG) - qDebug("QProcessPrivate::killProcess()"); + qDebug("QProcessPrivate::terminateProcess()"); #endif if (pid) ::kill(pid_t(pid), SIGTERM); -- cgit v1.2.3 From 9bc352e38d6b03fbb12a359a7bdfc8d22aa7e192 Mon Sep 17 00:00:00 2001 From: Kai Pastor Date: Wed, 23 Mar 2016 19:26:02 +0100 Subject: Enable cmake auto tests for -no-gui This change disables tests which require QtGui. Change-Id: Ib647afd086f54536054cb4c0cde5696d762ee8c4 Reviewed-by: Stephen Kelly Reviewed-by: Kevin Funk --- src/corelib/Qt5CTestMacros.cmake | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/corelib') diff --git a/src/corelib/Qt5CTestMacros.cmake b/src/corelib/Qt5CTestMacros.cmake index 6451f65b55..a1044fa89a 100644 --- a/src/corelib/Qt5CTestMacros.cmake +++ b/src/corelib/Qt5CTestMacros.cmake @@ -39,6 +39,9 @@ if (CMAKE_VERBOSE_MAKEFILE) list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_VERBOSE_MAKEFILE=1") endif() +if (NO_GUI) + list(APPEND BUILD_OPTIONS_LIST "-DNO_GUI=True") +endif() if (NO_WIDGETS) list(APPEND BUILD_OPTIONS_LIST "-DNO_WIDGETS=True") endif() -- cgit v1.2.3 From bedf0367ac580a2e73712be2f4207bb6af9f0226 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 1 Apr 2016 08:32:37 +0200 Subject: QVariant: Fix flags for type-erased associative iterator key The flags here are passed to a private QVariant constructor, and they really represent a boolean - IsPointer or not. Because the flag for the key_type was incorrectly populated with the flag for the value_type, memory would be corrupted when using a mapping type whose value_type is a pointer, but whose key type was not, such as QMap This typo has been there since the concept was introduced in commit v5.2.0-alpha1~807 (Add container access functionality for associative containers in QVariant., 2013-04-05). Task-number: QTBUG-52246 Change-Id: I9ecb13c603015eed2dc2ca43947fa0ecd6be8b5a Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/kernel/qmetatype.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/corelib') diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 3b8f8e7166..899a51173e 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1226,7 +1226,7 @@ public: inline void destroyIter() { _destroyIter(&_iterator); } - inline VariantData getCurrentKey() const { return _getKey(&_iterator, _metaType_id_key, _metaType_flags_value); } + inline VariantData getCurrentKey() const { return _getKey(&_iterator, _metaType_id_key, _metaType_flags_key); } inline VariantData getCurrentValue() const { return _getValue(&_iterator, _metaType_id_value, _metaType_flags_value); } inline void find(const VariantData &key) -- cgit v1.2.3