procedure TBoundedBuffer.ResetState; { Closes handles and deallocates memory. Note that this must unblock threads in such a manner that they quit cleanly } var SemCount: integer; begin if FBufInit then begin WaitForSingleObject(FCriticalMutex, DefaultWaitTime); FBufInit := false; FBufSize := 0; FreeMem(FBuf); repeat ReleaseSemaphore(FEntriesFree, 1, @SemCount); until SemCount = 0; repeat ReleaseSemaphore(FEntriesUsed, 1, @SemCount); until SemCount = 0; CloseHandle(FEntriesFree); CloseHandle(FEntriesUsed); CloseHandle(FCriticalMutex); end; end;