139 lines
3.1 KiB
C++
139 lines
3.1 KiB
C++
/*
|
|
* This is a part of the BugTrap package.
|
|
* Copyright (c) 2005-2009 IntelleSoft.
|
|
* All rights reserved.
|
|
*
|
|
* Description: Base class for in-memory log file.
|
|
* Author: Maksim Pyatkovskiy.
|
|
*
|
|
* This source code is only intended as a supplement to the
|
|
* BugTrap package reference and related electronic documentation
|
|
* provided with the product. See these sources for detailed
|
|
* information regarding the BugTrap package.
|
|
*/
|
|
|
|
#include "StdAfx.h"
|
|
#include "InMemLogFile.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
/**
|
|
* @param dwInitialLogSizeInBytes - initial log file size.
|
|
*/
|
|
CInMemLogFile::CInMemLogFile(DWORD dwInitialLogSizeInBytes)
|
|
{
|
|
m_dwLogSizeInEntries = MAXDWORD;
|
|
m_dwLogSizeInBytes = MAXDWORD;
|
|
m_dwNumEntries = 0;
|
|
m_dwInitialLogSizeInBytes = dwInitialLogSizeInBytes;
|
|
m_dwNumBytes = dwInitialLogSizeInBytes;
|
|
m_pFirstEntry = NULL;
|
|
m_pLastEntry = NULL;
|
|
}
|
|
|
|
/**
|
|
* @param pLogEntry - new log entry.
|
|
*/
|
|
void CInMemLogFile::AddToHead(CLogEntry* pLogEntry)
|
|
{
|
|
_ASSERTE(pLogEntry != NULL);
|
|
pLogEntry->m_pPrevEntry = NULL;
|
|
pLogEntry->m_pNextEntry = m_pFirstEntry;
|
|
if (m_pFirstEntry)
|
|
m_pFirstEntry->m_pPrevEntry = pLogEntry;
|
|
else
|
|
m_pLastEntry = pLogEntry;
|
|
m_pFirstEntry = pLogEntry;
|
|
m_dwNumBytes += pLogEntry->m_dwSize;
|
|
++m_dwNumEntries;
|
|
FreeTail();
|
|
}
|
|
|
|
/**
|
|
* @param pLogEntry - new log entry.
|
|
*/
|
|
void CInMemLogFile::AddToTail(CLogEntry* pLogEntry)
|
|
{
|
|
_ASSERTE(pLogEntry != NULL);
|
|
pLogEntry->m_pPrevEntry = m_pLastEntry;
|
|
pLogEntry->m_pNextEntry = NULL;
|
|
if (m_pLastEntry)
|
|
m_pLastEntry->m_pNextEntry = pLogEntry;
|
|
else
|
|
m_pFirstEntry = pLogEntry;
|
|
m_pLastEntry = pLogEntry;
|
|
m_dwNumBytes += pLogEntry->m_dwSize;
|
|
++m_dwNumEntries;
|
|
FreeHead();
|
|
}
|
|
|
|
void CInMemLogFile::DeleteHead(void)
|
|
{
|
|
_ASSERTE(m_pFirstEntry != NULL);
|
|
CLogEntry* pLogEntry = m_pFirstEntry;
|
|
m_pFirstEntry = pLogEntry->m_pNextEntry;
|
|
if (m_pFirstEntry)
|
|
m_pFirstEntry->m_pPrevEntry = NULL;
|
|
else
|
|
m_pLastEntry = NULL;
|
|
m_dwNumBytes -= pLogEntry->m_dwSize;
|
|
--m_dwNumEntries;
|
|
delete[] (PBYTE)pLogEntry;
|
|
}
|
|
|
|
void CInMemLogFile::DeleteTail(void)
|
|
{
|
|
_ASSERTE(m_pLastEntry != NULL);
|
|
CLogEntry* pLogEntry = m_pLastEntry;
|
|
m_pLastEntry = pLogEntry->m_pPrevEntry;
|
|
if (m_pLastEntry)
|
|
m_pLastEntry->m_pNextEntry = NULL;
|
|
else
|
|
m_pFirstEntry = NULL;
|
|
m_dwNumBytes -= pLogEntry->m_dwSize;
|
|
--m_dwNumEntries;
|
|
delete[] (PBYTE)pLogEntry;
|
|
}
|
|
|
|
void CInMemLogFile::FreeHead(void)
|
|
{
|
|
if (m_dwLogSizeInEntries != MAXDWORD)
|
|
{
|
|
while (m_dwNumEntries > m_dwLogSizeInEntries && m_dwNumEntries > 0)
|
|
DeleteHead();
|
|
}
|
|
if (m_dwLogSizeInBytes != MAXDWORD)
|
|
{
|
|
while (m_dwNumBytes > m_dwLogSizeInBytes && m_dwNumEntries > 0)
|
|
DeleteHead();
|
|
}
|
|
}
|
|
|
|
void CInMemLogFile::FreeTail(void)
|
|
{
|
|
if (m_dwLogSizeInEntries != MAXDWORD)
|
|
{
|
|
while (m_dwNumEntries > m_dwLogSizeInEntries && m_dwNumEntries > 0)
|
|
DeleteTail();
|
|
}
|
|
if (m_dwLogSizeInBytes != MAXDWORD)
|
|
{
|
|
while (m_dwNumBytes > m_dwLogSizeInBytes && m_dwNumEntries > 0)
|
|
DeleteTail();
|
|
}
|
|
}
|
|
|
|
void CInMemLogFile::FreeEntries(void)
|
|
{
|
|
while (m_pFirstEntry)
|
|
{
|
|
CLogEntry* pNextEntry = m_pFirstEntry->m_pNextEntry;
|
|
delete[] (PBYTE)m_pFirstEntry;
|
|
m_pFirstEntry = pNextEntry;
|
|
}
|
|
m_pLastEntry = NULL;
|
|
m_dwNumEntries = 0;
|
|
m_dwNumBytes = m_dwInitialLogSizeInBytes;
|
|
}
|