When it runs, lldb-mi creates a log file. There is an option --noLog to disable the creation but it does not work and you end up with log file. This happens as log is enabled in a few places in the code although it has been disabled by this option. This commit tried to fix the problem in the following way. Log file generation is disabled by default. You can enable it by giving --log option. It is the only way to enable it. Rest of the call have been removed. So the code basically remove the calls that enable the log unconditionally and changes the option --noLog to --log. llvm-svn: 227810
370 lines
11 KiB
C++
370 lines
11 KiB
C++
//===-- MICmnLog.cpp --------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//++
|
|
// File: MICmnLog.cpp
|
|
//
|
|
// Overview: CMICmnLog implementation.
|
|
//
|
|
// Environment: Compilers: Visual C++ 12.
|
|
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
|
|
// Libraries: See MIReadmetxt.
|
|
//
|
|
// Copyright: None.
|
|
//--
|
|
|
|
// In-house headers:
|
|
#include "MICmnLog.h"
|
|
#include "MICmnLogMediumFile.h"
|
|
#include "MIDriverMgr.h"
|
|
#include "MICmnResources.h"
|
|
#include "MIUtilDateTimeStd.h"
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: CMICmnLog constructor.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: None.
|
|
// Throws: None.
|
|
//--
|
|
CMICmnLog::CMICmnLog(void)
|
|
: m_bEnabled(false)
|
|
, m_bInitializingATM(false)
|
|
{
|
|
// Do not use this constructor, use Initialize()
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: CMICmnLog destructor.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: None.
|
|
// Throws: None.
|
|
//--
|
|
CMICmnLog::~CMICmnLog(void)
|
|
{
|
|
Shutdown();
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Initialize resources for *this Logger.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::Initialize(void)
|
|
{
|
|
m_clientUsageRefCnt++;
|
|
|
|
if (m_bInitialized)
|
|
return MIstatus::success;
|
|
|
|
ClrErrorDescription();
|
|
|
|
// Mediums set inside because explicitly initing in MIDriverMain.cpp causes compile errors with CAtlFile
|
|
CMICmnLogMediumFile &rFileLog(CMICmnLogMediumFile::Instance());
|
|
bool bOk = RegisterMedium(rFileLog);
|
|
if (bOk)
|
|
{
|
|
// Set the Log trace file's header
|
|
const CMIUtilString &rCR(rFileLog.GetLineReturn());
|
|
CMIUtilDateTimeStd date;
|
|
CMIUtilString msg;
|
|
msg = CMIUtilString::Format("%s\n", CMIDriverMgr::Instance().GetAppVersion().c_str());
|
|
CMIUtilString logHdr(msg);
|
|
msg = CMIUtilString::Format(MIRSRC(IDS_LOG_MSG_CREATION_DATE), date.GetDate().c_str(), date.GetTime().c_str(), rCR.c_str());
|
|
logHdr += msg;
|
|
msg = CMIUtilString::Format(MIRSRC(IDS_LOG_MSG_FILE_LOGGER_PATH), rFileLog.GetFileNamePath().c_str(), rCR.c_str());
|
|
logHdr += msg;
|
|
|
|
bOk = rFileLog.SetHeaderTxt(logHdr);
|
|
|
|
// Note log file medium's status is not available until we write at least once to the file (so just write the title 1st line)
|
|
m_bInitializingATM = true;
|
|
CMICmnLog::WriteLog(".");
|
|
if (!rFileLog.IsOk())
|
|
{
|
|
const CMIUtilString msg(
|
|
CMIUtilString::Format(MIRSRC(IDS_LOG_ERR_FILE_LOGGER_DISABLED), rFileLog.GetErrorDescription().c_str()));
|
|
CMICmnLog::WriteLog(msg);
|
|
}
|
|
m_bInitializingATM = false;
|
|
}
|
|
|
|
m_bInitialized = bOk;
|
|
|
|
return bOk;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Release resources for *this Logger.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::Shutdown(void)
|
|
{
|
|
if (--m_clientUsageRefCnt > 0)
|
|
return MIstatus::success;
|
|
|
|
if (!m_bInitialized)
|
|
return MIstatus::success;
|
|
|
|
ClrErrorDescription();
|
|
|
|
const bool bOk = UnregisterMediumAll();
|
|
|
|
m_bInitialized = bOk;
|
|
|
|
return bOk;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Enabled or disable *this Logger from writing any data to registered clients.
|
|
// Type: Method.
|
|
// Args: vbYes - (R) True = Logger enabled, false = disabled.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::SetEnabled(const bool vbYes)
|
|
{
|
|
m_bEnabled = vbYes;
|
|
|
|
return MIstatus::success;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Retrieve state whether *this Logger is enabled writing data to registered clients.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: True = Logger enable.
|
|
// False = disabled.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::GetEnabled(void) const
|
|
{
|
|
return m_bEnabled;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Unregister all the Mediums registered with *this Logger.
|
|
// Type: Method.
|
|
// Args: None.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::UnregisterMediumAll(void)
|
|
{
|
|
MapMediumToName_t::const_iterator it = m_mapMediumToName.begin();
|
|
for (; it != m_mapMediumToName.end(); it++)
|
|
{
|
|
IMedium *pMedium = (*it).first;
|
|
pMedium->Shutdown();
|
|
}
|
|
|
|
m_mapMediumToName.clear();
|
|
|
|
return MIstatus::success;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Register a Medium with *this Logger.
|
|
// Type: Method.
|
|
// Args: vrMedium - (R) The medium to register.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::RegisterMedium(const IMedium &vrMedium)
|
|
{
|
|
if (HaveMediumAlready(vrMedium))
|
|
return MIstatus::success;
|
|
|
|
IMedium *pMedium = const_cast<IMedium *>(&vrMedium);
|
|
if (!pMedium->Initialize())
|
|
{
|
|
const CMIUtilString &rStrMedName(pMedium->GetName());
|
|
const CMIUtilString &rStrMedErr(pMedium->GetError());
|
|
SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LOG_MEDIUM_ERR_INIT), rStrMedName.c_str(), rStrMedErr.c_str()));
|
|
return MIstatus::failure;
|
|
}
|
|
|
|
MapPairMediumToName_t pr(pMedium, pMedium->GetName());
|
|
m_mapMediumToName.insert(pr);
|
|
|
|
return MIstatus::success;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Query the Logger to see if a medium is already registered.
|
|
// Type: Method.
|
|
// Args: vrMedium - (R) The medium to query.
|
|
// Return: True - registered.
|
|
// False - not registered.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::HaveMediumAlready(const IMedium &vrMedium) const
|
|
{
|
|
IMedium *pMedium = const_cast<IMedium *>(&vrMedium);
|
|
const MapMediumToName_t::const_iterator it = m_mapMediumToName.find(pMedium);
|
|
if (it != m_mapMediumToName.end())
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Unregister a medium from the Logger.
|
|
// Type: Method.
|
|
// Args: vrMedium - (R) The medium to unregister.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::UnregisterMedium(const IMedium &vrMedium)
|
|
{
|
|
IMedium *pMedium = const_cast<IMedium *>(&vrMedium);
|
|
m_mapMediumToName.erase(pMedium);
|
|
|
|
return MIstatus::success;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: The callee client uses this function to write to the Logger. The data to be
|
|
// written is given out to all the mediums registered. The verbosity type parameter
|
|
// indicates to the medium(s) the type of data or message given to it. The medium has
|
|
// modes of verbosity and depending on the verbosity set determines which writes
|
|
// go in to the logger.
|
|
// The logger must be initialized successfully before a write to any registered
|
|
// can be carried out.
|
|
// Type: Method.
|
|
// Args: vData - (R) The data to write to the logger.
|
|
// veType - (R) Verbosity type.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::Write(const CMIUtilString &vData, const ELogVerbosity veType)
|
|
{
|
|
if (!m_bInitialized && !m_bInitializingATM)
|
|
return MIstatus::success;
|
|
if (m_bRecursiveDive)
|
|
return MIstatus::success;
|
|
if (!m_bEnabled)
|
|
return MIstatus::success;
|
|
|
|
m_bRecursiveDive = true;
|
|
|
|
MIuint cnt = 0;
|
|
MIuint cntErr = 0;
|
|
{
|
|
MapMediumToName_t::const_iterator it = m_mapMediumToName.begin();
|
|
while (it != m_mapMediumToName.end())
|
|
{
|
|
IMedium *pMedium = (*it).first;
|
|
const CMIUtilString &rNameMedium = (*it).second;
|
|
MIunused(rNameMedium);
|
|
if (pMedium->Write(vData, veType))
|
|
cnt++;
|
|
else
|
|
cntErr++;
|
|
|
|
// Next
|
|
++it;
|
|
}
|
|
}
|
|
|
|
bool bOk = MIstatus::success;
|
|
const MIuint mediumCnt = m_mapMediumToName.size();
|
|
if ((cnt == 0) && (mediumCnt > 0))
|
|
{
|
|
SetErrorDescription(MIRSRC(IDS_LOG_MEDIUM_ERR_WRITE_ANY));
|
|
bOk = MIstatus::failure;
|
|
}
|
|
if (bOk && (cntErr != 0))
|
|
{
|
|
SetErrorDescription(MIRSRC(IDS_LOG_MEDIUM_ERR_WRITE_MEDIUMFAIL));
|
|
bOk = MIstatus::failure;
|
|
}
|
|
|
|
m_bRecursiveDive = false;
|
|
|
|
return bOk;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Short cut function call to write only to the Log file.
|
|
// The logger must be initialized successfully before a write to any registered
|
|
// can be carried out.
|
|
// Type: Static.
|
|
// Args: vData - (R) The data to write to the logger.
|
|
// Return: MIstatus::success - Functional succeeded.
|
|
// MIstatus::failure - Functional failed.
|
|
// Throws: None.
|
|
//--
|
|
bool
|
|
CMICmnLog::WriteLog(const CMIUtilString &vData)
|
|
{
|
|
return CMICmnLog::Instance().Write(vData, CMICmnLog::eLogVerbosity_Log);
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Retrieve a string detailing the last error.
|
|
// Type: Method.
|
|
// Args: None,
|
|
// Return: CMIUtilString.
|
|
// Throws: None.
|
|
//--
|
|
const CMIUtilString &
|
|
CMICmnLog::GetErrorDescription(void) const
|
|
{
|
|
return m_strMILastErrorDescription;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Set the internal description of the last error.
|
|
// Type: Method.
|
|
// Args: (R) String containing a description of the last error.
|
|
// Return: None.
|
|
// Throws: None.
|
|
//--
|
|
void
|
|
CMICmnLog::SetErrorDescription(const CMIUtilString &vrTxt) const
|
|
{
|
|
m_strMILastErrorDescription = vrTxt;
|
|
}
|
|
|
|
//++ ------------------------------------------------------------------------------------
|
|
// Details: Clear the last error.
|
|
// Type: None.
|
|
// Args: None.
|
|
// Return: None.
|
|
// Throws: None.
|
|
//--
|
|
void
|
|
CMICmnLog::ClrErrorDescription(void) const
|
|
{
|
|
m_strMILastErrorDescription = CMIUtilString("");
|
|
}
|