//Sin compilar.//1ª Parte
#include <windows.h>
typedef char ** TBufferEntries;
class TBoundedBuffer
{
private :
bool FBufInit;
int FBufSize;
TBufferEntries FBuf;
int FReadPtr, FWritePtr;
HANDLE FEntriesFree, FEntriesUsed;
HANDLE FCriticalMutex;
int FEntryCountFree, FEntryCountUsed;
protected:
void SetSize(int NewSize);
bool ControlledWait(HANDLE Semaphore);
public :
void ResetState(void);
virtual ~TBoundedBuffer();
bool PutItem(void *NewItem);
void *GetItem(void);
bool GetEntriesFree(int &Free);
bool GetEntriesUsed(int &Used);
__published:
__property int Size={read=FBufSize, write=SetSize};
};
//2ª Parte
void TBoundedBuffer::SetSize(int NewSize)
{
if(FBufInit)
ResetState();
if(NewSize < 2)
NewSize = 2;
FBufSize = NewSize;
FBuf=new(void *)[FBufSize];
memset(FBuf, 0x00, sizeof(void *)*FBufSize);
FCriticalMutex = CreateMutex(NULL, false, NULL);
WaitForSingleObject(FCriticalMutex, INFINITE);
FBufInit = true;
FEntriesFree = CreateSemaphore(NULL, FBufSize - 1, FBufSize, NULL);
FEntriesUsed = CreateSemaphore(NULL, 0, FBufSize, NULL);
FEntryCountFree = FBufSize - 1;
FEntryCountUsed = 0;
ReleaseMutex(FCriticalMutex);
if ((FCriticalMutex = 0)| |(FEntriesFree = 0)| |(FEntriesUsed = 0))
ResetState();
}
//3ª Parte
void TBoundedBuffer::ResetState(void)
{
if(FBufInit)
{
WaitForSingleObject(FCriticalMutex, DefaultWaitTime);
FBufInit = false;
FBufSize = 0;
delete(FBuf);
ReleaseSemaphore(FEntriesUsed, 1, NULL);
ReleaseSemaphore(FEntriesFree, 1, NULL);
CloseHandle(FEntriesFree);
CloseHandle(FEntriesUsed);
ReleaseMutex(FCriticalMutex);
CloseHandle(FCriticalMutex);
}
}