uLib  User mode C/C++ extended API library for Win32 programmers.
RingBuffer Support

Module Description

Circular buffers for arbitrary heterogenous content.
#include <uLib/RingBuffer.h>

Circular buffers can be very convenient, but have slower performance than
linear buffers, due to the incessant need to check for buffer bounds index wrap.

An example of ringbuffer use is the BIOS keyboard input buffer.
Another example is a MIDI input buffer.

Classes

class  RingBuffer
 

Macros

#define EXCEPTION_RINGBUFFER_INVALID_INDEX   MAKE_SOFTEXCEPTION( ERROR_SEVERITY_ERROR, FACILITY_ULIB, ERROR_INVALID_INDEX )
 

Typedefs

typedef RingBufferPRingBuffer
 

Macro Definition Documentation

◆ EXCEPTION_RINGBUFFER_INVALID_INDEX

#define EXCEPTION_RINGBUFFER_INVALID_INDEX   MAKE_SOFTEXCEPTION( ERROR_SEVERITY_ERROR, FACILITY_ULIB, ERROR_INVALID_INDEX )

[PRELIMINARY] Index fault exception raised by RingBuffer::operator[].
ExceptionInformation[0] == Address of RingBuffer instance.
ExceptionInformation[1] == Faulting subscript index.

Example Handling EXCEPTION_RINGBUFFER_INVALID_INDEX

DWORD __rbxFilter( IN PEXCEPTION_POINTERS pexPtr, OUT PEXCEPTION_RECORD pexRec );
void TestRingBufferException( RingBuffer& rb )
{
EXCEPTION_RECORD exRec = { 0 };
__try
{
UINT badIndex = rb.Size(); // Index is zero-based..
BYTE& brf = rb[ badIndex ]; // Here we (don't) go..
}
__except( __rbxFilter( GetExceptionInformation(), &exRec ))
{
PRingBuffer pRBuf = (PRingBuffer) exRec.ExceptionInformation[ 0 ];
UINT index = (UINT) exRec.ExceptionInformation[ 1 ];
DWORD err = HRESULT_CODE( exRec.ExceptionCode ); // 1413 - ERROR_INVALID_INDEX
_F("Error=%s PRingBuffer=%p, BadIndex=%lu, Used=%lu of %lu\n"),
SysErrorMsg( err ), pRBuf, index, pRBuf->Used(), pRBuf->Size()
);
}
}
DWORD __rbxFilter( IN PEXCEPTION_POINTERS pexPtr, OUT PEXCEPTION_RECORD pexRec )
{
if (EXCEPTION_RINGBUFFER_INVALID_INDEX == pexPtr->ExceptionRecord->ExceptionCode)
{
memcpy( pexRec, pexPtr->ExceptionRecord, sizeof(EXCEPTION_RECORD) );
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
}

Definition at line 115 of file RingBuffer.h.

Typedef Documentation

◆ PRingBuffer

Definition at line 110 of file RingBuffer.h.