csgo-2018-source/tier2/tier2_logging.cpp

124 lines
3.6 KiB
C++
Raw Permalink Normal View History

2021-07-25 12:11:47 +08:00
//============ Copyright (c) Valve Corporation, All rights reserved. ============
//
// Tier2 logging helpers.
//
//===============================================================================
#include "tier2_logging.h"
#include "filesystem.h"
#include "interfaces/interfaces.h"
CFileLoggingListener::CFileLoggingListener()
{
for ( int i = 0; i < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT; ++ i )
{
m_OpenFiles[i].Reset();
}
for ( int i = 0; i < MAX_LOGGING_CHANNEL_COUNT; ++ i )
{
m_FileIndices[i] = INVALID_LOGGING_FILE_HANDLE;
}
}
CFileLoggingListener::~CFileLoggingListener()
{
for ( int i = 0; i < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT; ++ i )
{
if ( m_OpenFiles[i].IsOpen() )
{
g_pFullFileSystem->Close( m_OpenFiles[i].m_FileHandle );
m_OpenFiles[i].Reset();
}
}
}
LoggingFileHandle_t CFileLoggingListener::BeginLoggingToFile( const char *pFilename, const char *pOptions, const char *pPathID /* = NULL */ )
{
int fileHandle = GetUnusedFileInfo();
if ( fileHandle != INVALID_LOGGING_FILE_HANDLE )
{
m_OpenFiles[fileHandle].m_FileHandle = g_pFullFileSystem->Open( pFilename, pOptions, pPathID );
}
return fileHandle;
}
void CFileLoggingListener::EndLoggingToFile( LoggingFileHandle_t fileHandle )
{
Assert( fileHandle >= 0 && fileHandle < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT );
/* if the file had any channels associated with it, disassociate them. */
if ( fileHandle != INVALID_LOGGING_FILE_HANDLE )
{
for ( int i = 0 ; i < MAX_LOGGING_CHANNEL_COUNT ; ++i )
{
if ( m_FileIndices[i] == fileHandle )
UnassignLogChannel( i );
}
}
g_pFullFileSystem->Close( m_OpenFiles[fileHandle].m_FileHandle );
m_OpenFiles[fileHandle].Reset();
}
void CFileLoggingListener::AssignLogChannel( LoggingChannelID_t channelID, LoggingFileHandle_t loggingFileHandle )
{
Assert( loggingFileHandle >= 0 && loggingFileHandle < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT );
Assert( m_OpenFiles[loggingFileHandle].IsOpen() );
Assert( channelID >= 0 && channelID < MAX_LOGGING_CHANNEL_COUNT );
m_FileIndices[channelID] = loggingFileHandle;
}
void CFileLoggingListener::UnassignLogChannel( LoggingChannelID_t channelID )
{
Assert( channelID >= 0 && channelID < MAX_LOGGING_CHANNEL_COUNT );
m_FileIndices[channelID] = INVALID_LOGGING_FILE_HANDLE;
}
void CFileLoggingListener::AssignAllLogChannels( LoggingFileHandle_t loggingFileHandle )
{
Assert( loggingFileHandle >= 0 && loggingFileHandle < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT );
Assert( m_OpenFiles[loggingFileHandle].IsOpen() );
for ( int i = 0; i < MAX_LOGGING_CHANNEL_COUNT; ++ i )
{
m_FileIndices[i] = loggingFileHandle;
}
}
void CFileLoggingListener::UnassignAllLogChannels()
{
for ( int i = 0; i < MAX_LOGGING_CHANNEL_COUNT; ++ i )
{
m_FileIndices[i] = INVALID_LOGGING_FILE_HANDLE;
}
}
void CFileLoggingListener::Log( const LoggingContext_t *pContext, const char *pMessage )
{
if ( ( pContext->m_Flags & LCF_CONSOLE_ONLY ) != 0 )
{
return;
}
Assert( pContext->m_ChannelID >= 0 && pContext->m_ChannelID < MAX_LOGGING_CHANNEL_COUNT );
int nFileIndex = m_FileIndices[pContext->m_ChannelID];
if ( nFileIndex >= 0 && nFileIndex < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT )
{
// Shouldn't be trying to log to a closed file.
Assert( m_OpenFiles[nFileIndex].IsOpen() );
g_pFullFileSystem->Write( pMessage, Q_strlen( pMessage ), m_OpenFiles[nFileIndex].m_FileHandle );
g_pFullFileSystem->Flush( m_OpenFiles[nFileIndex].m_FileHandle );
}
}
int CFileLoggingListener::GetUnusedFileInfo() const
{
for ( int i = 0; i < MAX_SIMULTANEOUS_LOGGING_FILE_COUNT; ++ i )
{
if ( !m_OpenFiles[i].IsOpen() )
{
return i;
}
}
return INVALID_LOGGING_FILE_HANDLE;
}