Multithreading — The Delphi Way · © 2000 Martin Harvey
Source example 20
procedure TBoundedBuffer.ResetState;
var
SemCount: integer;
LocalHandle: THandle;
begin
if FBufInit then
begin
WaitForSingleObject(FCriticalMutex, DefaultWaitTime);
FBufInit := false;
FBufSize := 0;
FreeMem(FBuf);
LocalHandle := FEntriesFree;
FEntriesFree := 0;
repeat
ReleaseSemaphore(LocalHandle, 1, @SemCount);
until SemCount = 0;
CloseHandle(LocalHandle);
LocalHandle := FEntriesUsed;
FEntriesUsed := 0;
repeat
ReleaseSemaphore(LocalHandle, 1, @SemCount);
until SemCount = 0;
CloseHandle(LocalHandle);
CloseHandle(FCriticalMutex);
end;
end;