Important Update:
- CItemBuffer: - Rename CItemBufferCore -> CItemBuffer - Add item count and GetCount() method - Bug fix: Reset LastItem on DeleteAll() - TimingCore: - Bug fix: Handle buffer overflow on 32-bit processors
This commit is contained in:
@@ -16,10 +16,11 @@
|
|||||||
|
|
||||||
//***** Function Prototypes *****//
|
//***** Function Prototypes *****//
|
||||||
|
|
||||||
CItemBufferCore::CItemBufferCore( bool pCopyEntries )
|
CItemBuffer::CItemBuffer( bool pCopyEntries )
|
||||||
{
|
{
|
||||||
// Parameters
|
// Parameters
|
||||||
CopyEntries = pCopyEntries;
|
CopyEntries = pCopyEntries;
|
||||||
|
Count = 0;
|
||||||
|
|
||||||
// Clear Event list
|
// Clear Event list
|
||||||
FirstItem = NULL;
|
FirstItem = NULL;
|
||||||
@@ -27,14 +28,14 @@ CItemBufferCore::CItemBufferCore( bool pCopyEntries )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CItemBufferCore::~ CItemBufferCore()
|
CItemBuffer::~ CItemBuffer()
|
||||||
{
|
{
|
||||||
// Free Event List
|
// Free Event List
|
||||||
DeleteAll();
|
DeleteAll();
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
TBufferItem * CItemBufferCore::CreateItem( void * Entry, int Size )
|
TBufferItem * CItemBuffer::CreateItem( void * Entry, int Size )
|
||||||
{
|
{
|
||||||
TBufferItem * BufferItem;
|
TBufferItem * BufferItem;
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ TBufferItem * CItemBufferCore::CreateItem( void * Entry, int Size )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CItemBufferCore::DestroyItem( TBufferItem ** BufferItem )
|
bool CItemBuffer::DestroyItem( TBufferItem ** BufferItem )
|
||||||
{
|
{
|
||||||
// Check if valid pointer
|
// Check if valid pointer
|
||||||
if (!BufferItem || !*BufferItem)
|
if (!BufferItem || !*BufferItem)
|
||||||
@@ -86,7 +87,7 @@ bool CItemBufferCore::DestroyItem( TBufferItem ** BufferItem )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CItemBufferCore::DestroyEntry( void ** Entry )
|
bool CItemBuffer::DestroyEntry( void ** Entry )
|
||||||
{
|
{
|
||||||
// Verify pointer
|
// Verify pointer
|
||||||
if (!Entry || !*Entry)
|
if (!Entry || !*Entry)
|
||||||
@@ -100,7 +101,7 @@ bool CItemBufferCore::DestroyEntry( void ** Entry )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CItemBufferCore::Push( void * Entry, int Size )
|
bool CItemBuffer::Push( void * Entry, int Size )
|
||||||
{
|
{
|
||||||
// Verify pointer
|
// Verify pointer
|
||||||
if (!Entry || !Size)
|
if (!Entry || !Size)
|
||||||
@@ -112,11 +113,12 @@ bool CItemBufferCore::Push( void * Entry, int Size )
|
|||||||
|
|
||||||
// Move Next entry reference
|
// Move Next entry reference
|
||||||
LastItem = &((*LastItem)->NextItem);
|
LastItem = &((*LastItem)->NextItem);
|
||||||
|
Count++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void * CItemBufferCore::Pop( int * Size )
|
void * CItemBuffer::Pop( int * Size )
|
||||||
{
|
{
|
||||||
void * Entry;
|
void * Entry;
|
||||||
|
|
||||||
@@ -124,13 +126,11 @@ void * CItemBufferCore::Pop( int * Size )
|
|||||||
if ((Entry = Peek( Size ))) {
|
if ((Entry = Peek( Size ))) {
|
||||||
Delete();
|
Delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
// return event
|
|
||||||
return Entry;
|
return Entry;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void * CItemBufferCore::Peek( int * Size )
|
void * CItemBuffer::Peek( int * Size )
|
||||||
{
|
{
|
||||||
void * Entry;
|
void * Entry;
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ void * CItemBufferCore::Peek( int * Size )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CItemBufferCore::Delete()
|
bool CItemBuffer::Delete()
|
||||||
{
|
{
|
||||||
TBufferItem * BufferItem;
|
TBufferItem * BufferItem;
|
||||||
|
|
||||||
@@ -170,11 +170,12 @@ bool CItemBufferCore::Delete()
|
|||||||
DestroyEntry( &(BufferItem->Entry) );
|
DestroyEntry( &(BufferItem->Entry) );
|
||||||
free( BufferItem );
|
free( BufferItem );
|
||||||
|
|
||||||
|
Count--;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void CItemBufferCore::DeleteAll()
|
void CItemBuffer::DeleteAll()
|
||||||
{
|
{
|
||||||
TBufferItem * NextItem;
|
TBufferItem * NextItem;
|
||||||
|
|
||||||
@@ -184,5 +185,7 @@ void CItemBufferCore::DeleteAll()
|
|||||||
DestroyItem( &FirstItem );
|
DestroyItem( &FirstItem );
|
||||||
FirstItem = NextItem;
|
FirstItem = NextItem;
|
||||||
}
|
}
|
||||||
|
LastItem = &FirstItem;
|
||||||
|
Count = 0;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -31,13 +31,14 @@ struct SBufferItem {
|
|||||||
|
|
||||||
//***** Function Prototypes *****//
|
//***** Function Prototypes *****//
|
||||||
|
|
||||||
class CItemBufferCore
|
class CItemBuffer
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
// Parameters
|
// Parameters
|
||||||
bool CopyEntries; // Make copies of entries and destroy them when done?
|
bool CopyEntries; // Make copies of entries and destroy them when done?
|
||||||
|
int Count;
|
||||||
|
|
||||||
// Events
|
// Items
|
||||||
TBufferItem * FirstItem;
|
TBufferItem * FirstItem;
|
||||||
TBufferItem ** LastItem;
|
TBufferItem ** LastItem;
|
||||||
|
|
||||||
@@ -49,8 +50,8 @@ class CItemBufferCore
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Initiate object
|
// Initiate object
|
||||||
CItemBufferCore( bool pCopyEntries );
|
CItemBuffer( bool pCopyEntries );
|
||||||
virtual ~CItemBufferCore();
|
virtual ~CItemBuffer();
|
||||||
|
|
||||||
// Buffer Operations
|
// Buffer Operations
|
||||||
bool Push( void * Entry, int Size );
|
bool Push( void * Entry, int Size );
|
||||||
@@ -58,6 +59,9 @@ class CItemBufferCore
|
|||||||
void * Peek( int * Size = NULL );
|
void * Peek( int * Size = NULL );
|
||||||
bool Delete();
|
bool Delete();
|
||||||
void DeleteAll();
|
void DeleteAll();
|
||||||
|
|
||||||
|
// Misc
|
||||||
|
int GetCount() { return Count; };
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
// Standard C/C++ Libraries
|
// Standard C/C++ Libraries
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
// redA Libraries
|
// redA Libraries
|
||||||
#include "TimingCore.h"
|
#include "TimingCore.h"
|
||||||
@@ -43,15 +44,17 @@ void ClearStartTime( timeval * StartTime )
|
|||||||
// Calculate TimePassed from Start Time (in milli-seconds)
|
// Calculate TimePassed from Start Time (in milli-seconds)
|
||||||
long TimePassed( timeval StartTime )
|
long TimePassed( timeval StartTime )
|
||||||
{
|
{
|
||||||
timeval CurrTime;
|
timeval CurrTime;
|
||||||
long Duration;
|
long Duration;
|
||||||
|
|
||||||
// Get current time
|
// Get current time
|
||||||
gettimeofday( &CurrTime, NULL );
|
gettimeofday( &CurrTime, NULL );
|
||||||
|
|
||||||
// Get time passed in milli-seconds
|
// Get time passed in milli-seconds
|
||||||
Duration = (CurrTime.tv_sec - StartTime.tv_sec) * 1000 +
|
Duration = (CurrTime.tv_sec - StartTime.tv_sec) * (time_t)1000 +
|
||||||
(CurrTime.tv_usec - StartTime.tv_usec) / 1000;
|
(CurrTime.tv_usec - StartTime.tv_usec) / (time_t)1000;
|
||||||
|
if (Duration < 0)
|
||||||
|
Duration = LONG_MAX;
|
||||||
|
|
||||||
return Duration;
|
return Duration;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user