DlangIconCache &DlangIconCache::instance() { if (!(staticInstance.load())) { QMutexLocker lock(&staticInstanceMutex); if (!(staticInstance.load())) { staticInstance = new DlangIconCache; } } return *(staticInstance.load()); }
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg) { // Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images) if (ctxt.function == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)") && msg == QString("QFSFileEngine::open: No file name specified")) return; QString LogMsg = QString("[%1] %2:%3 : ") .arg(QTime::currentTime().toString("HH:mm:ss.zzz")).arg(ctxt.file).arg(ctxt.line); switch (type) { case QtDebugMsg: LogMsg += "Debug"; break; case QtWarningMsg: LogMsg += "Warning"; break; case QtCriticalMsg: LogMsg += "Critical"; break; case QtFatalMsg: LogMsg += "Fatal"; break; default: break; } LogMsg += ": " + msg + "\n"; QByteArray LogMsgBytes = LogMsg.toUtf8(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr); #ifdef LOG_TO_FILE FILE * logFilePtr = logFileFile.load(); // atomically load the file pointer if (!logFilePtr) { logBufferMutex->lock(); if (logBuffer) logBuffer->append(LogMsgBytes); logBufferMutex->unlock(); } else { logBufferMutex->lock(); if (logBuffer) { // empty logBuffer to file foreach (QByteArray msg, *logBuffer) fwrite(msg.constData(), 1, msg.size(), logFilePtr); delete logBuffer; // no longer needed logBuffer = nullptr; } logBufferMutex->unlock(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFilePtr); fflush(logFilePtr); } #endif }
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg) { // Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images) if (ctxt.function == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)") && msg == QString("QFSFileEngine::open: No file name specified")) return; QString file = ctxt.file; // We're not using QT_MESSAGELOG_FILE here, because that can be 0, NULL, or // nullptr in release builds. QString path = QString(__FILE__); path = path.left(path.lastIndexOf('/') + 1); if (file.startsWith(path)) { file = file.mid(path.length()); } // Time should be in UTC to save user privacy on log sharing QTime time = QDateTime::currentDateTime().toUTC().time(); QString LogMsg = QString("[%1 UTC] %2:%3 : ").arg(time.toString("HH:mm:ss.zzz")).arg(file).arg(ctxt.line); switch (type) { case QtDebugMsg: LogMsg += "Debug"; break; case QtWarningMsg: LogMsg += "Warning"; break; case QtCriticalMsg: LogMsg += "Critical"; break; case QtFatalMsg: LogMsg += "Fatal"; break; default: break; } LogMsg += ": " + msg + "\n"; QByteArray LogMsgBytes = LogMsg.toUtf8(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr); #ifdef LOG_TO_FILE FILE* logFilePtr = logFileFile.load(); // atomically load the file pointer if (!logFilePtr) { logBufferMutex->lock(); if (logBuffer) logBuffer->append(LogMsgBytes); logBufferMutex->unlock(); } else { logBufferMutex->lock(); if (logBuffer) { // empty logBuffer to file foreach (QByteArray msg, *logBuffer) fwrite(msg.constData(), 1, msg.size(), logFilePtr); delete logBuffer; // no longer needed logBuffer = nullptr; } logBufferMutex->unlock(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFilePtr); fflush(logFilePtr); } #endif }