|  | @@ -19,6 +19,7 @@
 | 
	
		
			
				|  |  |  =========================================================================*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Qt includes
 | 
	
		
			
				|  |  | +#include <QAtomicInt>
 | 
	
		
			
				|  |  |  #include <QCoreApplication>
 | 
	
		
			
				|  |  |  #include <QThread>
 | 
	
		
			
				|  |  |  #include <QVariant>
 | 
	
	
		
			
				|  | @@ -31,6 +32,10 @@
 | 
	
		
			
				|  |  |  // STD includes
 | 
	
		
			
				|  |  |  #include <iostream>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Handling log messages may generate log messages, which would cause infinite loop.
 | 
	
		
			
				|  |  | +// We stop handling log messages if the maximum recursion depth is reached.
 | 
	
		
			
				|  |  | +static QAtomicInt ctkErrorLogQtMessageHandler_CurrentRecursionDepth;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  //------------------------------------------------------------------------------
 | 
	
		
			
				|  |  |  QString ctkErrorLogQtMessageHandler::HandlerName = QLatin1String("Qt");
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -59,11 +64,21 @@ namespace
 | 
	
		
			
				|  |  |  void ctkErrorLogModelQtMessageOutput(QtMsgType type, const QMessageLogContext& context,
 | 
	
		
			
				|  |  |                                       const QString& msg)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +  ctkErrorLogQtMessageHandler_CurrentRecursionDepth.ref();
 | 
	
		
			
				|  |  | +  // Allow a couple of recursion levels to get a hint about where and why recursion occurs,
 | 
	
		
			
				|  |  | +  // so we stop processing the message if recursion depth is over 10.
 | 
	
		
			
				|  |  | +  if (ctkErrorLogQtMessageHandler_CurrentRecursionDepth > 10)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    //TODO: use context in the log message
 | 
	
		
			
				|  |  |    Q_UNUSED(context)
 | 
	
		
			
				|  |  |    // Warning: To avoid inifinite loop, do not use Q_ASSERT in this function.
 | 
	
		
			
				|  |  |    if (msg.isEmpty())
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +    ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    ctkErrorLogLevel::LogLevel level = ctkErrorLogLevel::Unknown;
 | 
	
	
		
			
				|  | @@ -99,13 +114,24 @@ void ctkErrorLogModelQtMessageOutput(QtMsgType type, const QMessageLogContext& c
 | 
	
		
			
				|  |  |            ctk::qtHandleToString(QThread::currentThreadId()),
 | 
	
		
			
				|  |  |            level, handler->handlerPrettyName(), ctkErrorLogContext(msg), msg);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +  ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  |  void ctkErrorLogModelQtMessageOutput(QtMsgType type, const char *msg)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +  ctkErrorLogQtMessageHandler_CurrentRecursionDepth.ref();
 | 
	
		
			
				|  |  | +  // Allow a couple of recursion levels to get a hint about where and why recursion occurs,
 | 
	
		
			
				|  |  | +  // so we stop processing the message if recursion depth is over 10.
 | 
	
		
			
				|  |  | +  if (ctkErrorLogQtMessageHandler_CurrentRecursionDepth > 10)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // Warning: To avoid inifinite loop, do not use Q_ASSERT in this function.
 | 
	
		
			
				|  |  |    if (QString(msg).isEmpty())
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +    ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    ctkErrorLogLevel::LogLevel level = ctkErrorLogLevel::Unknown;
 | 
	
	
		
			
				|  | @@ -141,6 +167,7 @@ void ctkErrorLogModelQtMessageOutput(QtMsgType type, const char *msg)
 | 
	
		
			
				|  |  |            ctk::qtHandleToString(QThread::currentThreadId()),
 | 
	
		
			
				|  |  |            level, handler->handlerPrettyName(), ctkErrorLogContext(msg), msg);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +  ctkErrorLogQtMessageHandler_CurrentRecursionDepth.deref();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  }
 |