//===-- MIUtilDebug.cpp -----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// Third party headers:
#ifdef _WIN32
#include <windows.h>
#endif

// In-house headers:
#include "MICmnLog.h"
#include "MIDriver.h"
#include "MIUtilDebug.h"

//++
//------------------------------------------------------------------------------------
// Details: CMIUtilDebug constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMIUtilDebug::CMIUtilDebug() {}

//++
//------------------------------------------------------------------------------------
// Details: CMIUtilDebug destructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMIUtilDebug::~CMIUtilDebug() {}

//++
//------------------------------------------------------------------------------------
// Details: Temporarily stall the process/application to give the programmer the
//          opportunity to attach a debugger. How to use: Put a break in the
//          programmer
//          where you want to visit, run the application then attach your
//          debugger to the
//          application. Hit the debugger's pause button and the debugger should
//          should
//          show this loop. Change the i variable value to break out of the loop
//          and
//          visit your break point.
// Type:    Static method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
void CMIUtilDebug::WaitForDbgAttachInfinteLoop() {
  MIuint i = 0;
  while (i == 0) {
    const std::chrono::milliseconds time(100);
    std::this_thread::sleep_for(time);
  }
}

//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------

// Instantiations:
CMICmnLog &CMIUtilDebugFnTrace::ms_rLog = CMICmnLog::Instance();
MIuint CMIUtilDebugFnTrace::ms_fnDepthCnt = 0;

//++
//------------------------------------------------------------------------------------
// Details: CMIUtilDebugFnTrace constructor.
// Type:    Method.
// Args:    vFnName - (R) The text to insert into the log.
// Return:  None.
// Throws:  None.
//--
CMIUtilDebugFnTrace::CMIUtilDebugFnTrace(const CMIUtilString &vFnName)
    : m_strFnName(vFnName) {
  const CMIUtilString txt(
      CMIUtilString::Format("%d>%s", ++ms_fnDepthCnt, m_strFnName.c_str()));
  ms_rLog.Write(txt, CMICmnLog::eLogVerbosity_FnTrace);
}

//++
//------------------------------------------------------------------------------------
// Details: CMIUtilDebugFnTrace destructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMIUtilDebugFnTrace::~CMIUtilDebugFnTrace() {
  const CMIUtilString txt(
      CMIUtilString::Format("%d<%s", ms_fnDepthCnt--, m_strFnName.c_str()));
  ms_rLog.Write(txt, CMICmnLog::eLogVerbosity_FnTrace);
}
