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:
Charl Wentzel
2017-08-17 10:56:10 +02:00
parent 2b7c49d5bb
commit 8fd04dc9e2
3 changed files with 30 additions and 20 deletions

View File

@@ -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;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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; };
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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"
@@ -50,8 +51,10 @@ long TimePassed( timeval StartTime )
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;
} }