From e6558184ebda127ca10b4db97d98c328aa3d7be9 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 13 Jul 2012 13:31:45 +0200 Subject: [PATCH] Logging: Simplify message handler logic for windows Incorporate the functionality of qWinMessageHandler in qDefaultMessageHandler. Change-Id: Iec5b19e187c0d2e3d8d0874280ba57f6fb21d7b4 Reviewed-by: Stephen Kelly --- src/corelib/global/qlogging.cpp | 37 +++++++++---------------- src/corelib/kernel/qcoreapplication_win.cpp | 43 ----------------------------- 2 files changed, 13 insertions(+), 67 deletions(-) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index b0afc5a..c567d33 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -633,12 +633,21 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con const QString &buf) { QString logMessage = qMessageFormatString(type, context, buf); -#if defined(Q_OS_WINCE) - OutputDebugString(reinterpret_cast (logMessage.utf16())); -#else + +#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) +#if !defined(Q_OS_WINCE) + if (usingWinMain) +#endif + { + // OutputDebugString is not threadsafe. + static QBasicMutex outputDebugStringMutex; + QMutexLocker locker(&outputDebugStringMutex); + OutputDebugString(reinterpret_cast(logMessage.utf16())); + return; + } +#endif // Q_OS_WIN fprintf(stderr, "%s", logMessage.toLocal8Bit().constData()); fflush(stderr); -#endif } /*! @@ -728,18 +737,6 @@ void qErrnoWarning(int code, const char *msg, ...) qt_message_output(QtCriticalMsg, context, buf); } -#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) -extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str); -extern Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context, - const QString &str); - -void qWinMessageHandler2(QtMsgType t, const QMessageLogContext &context, - const char *str) -{ - qWinMessageHandler(t, context, QString::fromLocal8Bit(str)); -} -#endif - /*! \typedef QtMsgHandler \relates @@ -852,10 +849,6 @@ QtMessageHandler qInstallMessageHandler(QtMessageHandler h) messageHandler = qDefaultMessageHandler; QtMessageHandler old = messageHandler; messageHandler = h; -#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) - if (!messageHandler && usingWinMain) - messageHandler = qWinMessageHandler; -#endif return old; } @@ -867,10 +860,6 @@ QtMsgHandler qInstallMsgHandler(QtMsgHandler h) msgHandler = qDefaultMsgHandler; QtMsgHandler old = msgHandler; msgHandler = h; -#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB) - if (!msgHandler && usingWinMain) - msgHandler = qWinMsgHandler; -#endif return old; } diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp index 9d92f83..e424119 100644 --- a/src/corelib/kernel/qcoreapplication_win.cpp +++ b/src/corelib/kernel/qcoreapplication_win.cpp @@ -125,46 +125,6 @@ QString QCoreApplicationPrivate::appName() const return QFileInfo(qAppFileName()).baseName(); } -class QWinMsgHandlerCriticalSection -{ - CRITICAL_SECTION cs; -public: - QWinMsgHandlerCriticalSection() - { InitializeCriticalSection(&cs); } - ~QWinMsgHandlerCriticalSection() - { DeleteCriticalSection(&cs); } - - void lock() - { EnterCriticalSection(&cs); } - void unlock() - { LeaveCriticalSection(&cs); } -}; - -// defined in qlogging.cpp -extern Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, - const QMessageLogContext &context, - const QString &str); - -Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context, const QString &str) -{ - // cannot use QMutex here, because qWarning()s in the QMutex - // implementation may cause this function to recurse - static QWinMsgHandlerCriticalSection staticCriticalSection; - - QString message = qMessageFormatString(t, context, str); - - // OutputDebugString is not threadsafe. - staticCriticalSection.lock(); - OutputDebugString((wchar_t*)message.utf16()); - staticCriticalSection.unlock(); -} - -Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str) -{ - QMessageLogContext emptyContext; - qWinMessageHandler(t, emptyContext, QString::fromLocal8Bit(str)); -} - /***************************************************************************** qWinMain() - Initializes Windows. Called from WinMain() in qtmain_win.cpp *****************************************************************************/ @@ -187,9 +147,6 @@ void qWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdParam, already_called = true; usingWinMain = true; - // Install default debug handler - qInstallMessageHandler(qWinMessageHandler); - // Create command line argv = qWinCmdLine(cmdParam, int(strlen(cmdParam)), argc); -- 2.7.4