Fisheye: Tag c4cbf6cd567821f9a981586ab5d8294a26f873be refers to a dead (removed) revision in file `src/libchcore/TFailedBufferQueue.cpp'.
Fisheye: No comparison available.  Pass `N' to diff?
Fisheye: Tag c4cbf6cd567821f9a981586ab5d8294a26f873be refers to a dead (removed) revision in file `src/libchcore/TFailedBufferQueue.h'.
Fisheye: No comparison available.  Pass `N' to diff?
Index: src/libchcore/TOrderedBufferQueue.cpp
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOrderedBufferQueue.cpp	(.../TOrderedBufferQueue.cpp)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/TOrderedBufferQueue.cpp	(.../TOrderedBufferQueue.cpp)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -25,16 +25,28 @@
 {
 	TOrderedBufferQueue::TOrderedBufferQueue(unsigned long long ullExpectedPosition) :
 		m_eventHasBuffers(true, false),
+		m_eventHasError(true, false),
 		m_ullExpectedBufferPosition(ullExpectedPosition)
 	{
 	}
 
 	void TOrderedBufferQueue::Push(TOverlappedDataBuffer* pBuffer)
 	{
+		if(pBuffer->HasError())
+			throw TCoreException(eErr_InvalidArgument, L"Cannot push buffer with error", LOCATION);
+
 		auto pairInsert = m_setBuffers.insert(pBuffer);
 		if (!pairInsert.second)
 			throw TCoreException(eErr_InvalidArgument, L"Tried to insert duplicate buffer into the collection", LOCATION);
 
+		if(pBuffer->GetFilePosition() == m_ullErrorPosition)
+		{
+			if(m_pFirstErrorBuffer != nullptr)
+				throw TCoreException(eErr_InternalProblem, L"Buffer with error was not retrieved prior to adding same-by-position buffer without error", LOCATION);
+			m_ullErrorPosition = NoPosition;
+			UpdateHasErrors();
+		}
+
 		UpdateHasBuffers();
 	}
 
@@ -54,6 +66,18 @@
 		return pBuffer;
 	}
 
+	TOverlappedDataBuffer* TOrderedBufferQueue::PopError()
+	{
+		if(!m_pFirstErrorBuffer)
+			return nullptr;
+
+		TOverlappedDataBuffer* pBuffer = m_pFirstErrorBuffer;
+		m_pFirstErrorBuffer = nullptr;
+		UpdateHasErrors();
+
+		return pBuffer;
+	}
+
 	const TOverlappedDataBuffer* const TOrderedBufferQueue::Peek() const
 	{
 		if(!m_setBuffers.empty())
@@ -68,7 +92,7 @@
 
 	size_t TOrderedBufferQueue::GetCount() const
 	{
-		return m_setBuffers.size();
+		return m_setBuffers.size() + (m_pFirstErrorBuffer ? 1 : 0);
 	}
 
 	bool TOrderedBufferQueue::IsEmpty() const
@@ -81,13 +105,28 @@
 		return m_eventHasBuffers.Handle();
 	}
 
+	HANDLE TOrderedBufferQueue::GetHasErrorEvent() const
+	{
+		return m_eventHasError.Handle();
+	}
+
 	void TOrderedBufferQueue::ReleaseBuffers(const TBufferListPtr& spBuffers)
 	{
 		for(TOverlappedDataBuffer* pBuffer : m_setBuffers)
 		{
 			spBuffers->Push(pBuffer);
 		}
 		m_setBuffers.clear();
+
+		if(m_pFirstErrorBuffer)
+		{
+			spBuffers->Push(m_pFirstErrorBuffer);
+			m_pFirstErrorBuffer = nullptr;
+			m_ullErrorPosition = NoPosition;
+		}
+
+		UpdateHasBuffers();
+		UpdateHasErrors();
 	}
 
 	void TOrderedBufferQueue::UpdateHasBuffers()
@@ -97,4 +136,9 @@
 		else
 			m_eventHasBuffers.ResetEvent();
 	}
+
+	void TOrderedBufferQueue::UpdateHasErrors()
+	{
+		m_eventHasError.SetEvent(m_pFirstErrorBuffer != nullptr);
+	}
 }
Index: src/libchcore/TOrderedBufferQueue.h
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOrderedBufferQueue.h	(.../TOrderedBufferQueue.h)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/TOrderedBufferQueue.h	(.../TOrderedBufferQueue.h)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -23,6 +23,7 @@
 #include "TEvent.h"
 #include "TOverlappedDataBuffer.h"
 #include "TBufferList.h"
+#include "TCoreException.h"
 
 namespace chcore
 {
@@ -35,27 +36,70 @@
 		TOrderedBufferQueue(unsigned long long ullExpectedPosition);
 
 		void Push(TOverlappedDataBuffer* pBuffer);
+
+		template<class T>
+		void PushError(TOverlappedDataBuffer* pBuffer, T& rRetryQueue);
+
 		TOverlappedDataBuffer* Pop();
+		TOverlappedDataBuffer* PopError();
+
 		const TOverlappedDataBuffer* const Peek() const;
 
 		size_t GetCount() const;
+
 		bool IsEmpty() const;
 
 		HANDLE GetHasBuffersEvent() const;
+		HANDLE GetHasErrorEvent() const;
+
 		void ReleaseBuffers(const TBufferListPtr& spBuffers);
 
 	private:
 		bool IsBufferReady() const;
 		void UpdateHasBuffers();
+		void UpdateHasErrors();
 
 	private:
 		using BufferCollection = std::set<TOverlappedDataBuffer*, CompareBufferPositions>;
-
 		BufferCollection m_setBuffers;
+
+		TOverlappedDataBuffer* m_pFirstErrorBuffer = nullptr;
+		unsigned long long m_ullErrorPosition = NoPosition;
+
 		TEvent m_eventHasBuffers;
-		unsigned long long m_ullExpectedBufferPosition = NoPosition;
+		TEvent m_eventHasError;
+
+		unsigned long long m_ullExpectedBufferPosition = 0;
 	};
 
+	template<class T>
+	void TOrderedBufferQueue::PushError(TOverlappedDataBuffer* pBuffer, T& rRetryQueue)
+	{
+		if(!pBuffer->HasError())
+			throw TCoreException(eErr_InvalidArgument, L"Cannot push successful buffer to failed queue", LOCATION);
+
+		if(!m_pFirstErrorBuffer && m_ullErrorPosition == NoPosition)
+		{
+			m_pFirstErrorBuffer = pBuffer;
+			m_ullErrorPosition = pBuffer->GetFilePosition();
+			UpdateHasErrors();
+			return;
+		}
+
+		if(pBuffer->GetFilePosition() < m_ullErrorPosition)
+		{
+			rRetryQueue.Push(m_pFirstErrorBuffer, true);
+			m_pFirstErrorBuffer = pBuffer;
+			m_ullErrorPosition = pBuffer->GetFilePosition();
+		}
+		else if(pBuffer->GetFilePosition() > m_ullErrorPosition)
+			rRetryQueue.Push(pBuffer, true);
+		else
+			throw TCoreException(eErr_InvalidArgument, L"Trying to push the same buffer again", LOCATION);
+
+		UpdateHasErrors();
+	}
+
 	using TOrderedBufferQueuePtr = std::shared_ptr<TOrderedBufferQueue>;
 }
 
Index: src/libchcore/TOverlappedReader.cpp
===================================================================
diff -u -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOverlappedReader.cpp	(.../TOverlappedReader.cpp)	(revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28)
+++ src/libchcore/TOverlappedReader.cpp	(.../TOverlappedReader.cpp)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -28,7 +28,6 @@
 		unsigned long long ullFilePos, DWORD dwChunkSize) :
 		m_spLog(logger::MakeLogger(spLogFileData, L"DataBuffer")),
 		m_tEmptyBuffers(spEmptyBuffers, ullFilePos, dwChunkSize),
-		m_tFailedReadBuffers(),
 		m_spFullBuffers(std::make_shared<TOrderedBufferQueue>(ullFilePos))
 	{
 		if(!spEmptyBuffers)
@@ -63,12 +62,12 @@
 
 		LOG_TRACE(m_spLog) << L"Queuing buffer for re-read; buffer-order: " << pBuffer->GetFilePosition();
 
-		m_tFailedReadBuffers.PushWithFallback(pBuffer, m_tEmptyBuffers);
+		m_spFullBuffers->PushError(pBuffer, m_tEmptyBuffers);
 	}
 
 	TOverlappedDataBuffer* TOverlappedReader::GetFailedReadBuffer()
 	{
-		return m_tFailedReadBuffers.Pop();
+		return m_spFullBuffers->PopError();
 	}
 
 	void TOverlappedReader::AddFullBuffer(TOverlappedDataBuffer* pBuffer)
@@ -97,13 +96,12 @@
 
 	size_t TOverlappedReader::GetBufferCount() const
 	{
-		return m_tEmptyBuffers.GetCount() + m_tFailedReadBuffers.GetCount() + m_spFullBuffers->GetCount();
+		return m_tEmptyBuffers.GetCount() + m_spFullBuffers->GetCount();
 	}
 
 	void TOverlappedReader::ReleaseBuffers(const TBufferListPtr& spBuffers)
 	{
 		m_tEmptyBuffers.ReleaseBuffers(spBuffers);
-		m_tFailedReadBuffers.ReleaseBuffers(spBuffers);
 		m_spFullBuffers->ReleaseBuffers(spBuffers);
 	}
 }
Index: src/libchcore/TOverlappedReader.h
===================================================================
diff -u -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOverlappedReader.h	(.../TOverlappedReader.h)	(revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28)
+++ src/libchcore/TOverlappedReader.h	(.../TOverlappedReader.h)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -23,7 +23,6 @@
 #include "../liblogger/TLogger.h"
 #include "TOrderedBufferQueue.h"
 #include "TReadBufferQueueWrapper.h"
-#include "TFailedBufferQueue.h"
 
 namespace chcore
 {
@@ -56,7 +55,7 @@
 
 		// event access
 		HANDLE GetEventReadPossibleHandle() const { return m_tEmptyBuffers.GetHasBuffersEvent(); }
-		HANDLE GetEventReadFailedHandle() const { return m_tFailedReadBuffers.GetHasBuffersEvent(); }
+		HANDLE GetEventReadFailedHandle() const { return m_spFullBuffers->GetHasErrorEvent(); }
 		HANDLE GetEventReadFinishedHandle() const { return m_spFullBuffers->GetHasBuffersEvent(); }
 
 		size_t GetBufferCount() const;
@@ -67,7 +66,6 @@
 
 		// queues
 		TReadBufferQueueWrapper m_tEmptyBuffers;
-		TFailedBufferQueue m_tFailedReadBuffers;		// initialized empty buffers
 		TOrderedBufferQueuePtr m_spFullBuffers;			// buffers with data
 	};
 }
Index: src/libchcore/TOverlappedWriter.cpp
===================================================================
diff -u -rb6a48931b8155a01d871d050f52d915abb2df8ca -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision b6a48931b8155a01d871d050f52d915abb2df8ca)
+++ src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -28,7 +28,6 @@
 		unsigned long long ullFilePos) :
 		m_spLog(logger::MakeLogger(spLogFileData, L"DataBuffer")),
 		m_tBuffersToWrite(spBuffersToWrite),
-		m_tFailedWriteBuffers(),
 		m_tFinishedBuffers(ullFilePos),
 		m_bDataWritingFinished(false)
 	{
@@ -61,12 +60,12 @@
 		// overwrite error code (to avoid treating the buffer as failed read)
 		pBuffer->SetErrorCode(ERROR_SUCCESS);
 
-		m_tFailedWriteBuffers.PushWithFallback(pBuffer, m_tBuffersToWrite);
+		m_tFinishedBuffers.PushError(pBuffer, m_tBuffersToWrite);
 	}
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetFailedWriteBuffer()
 	{
-		return m_tFailedWriteBuffers.Pop();
+		return m_tFinishedBuffers.PopError();
 	}
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetFinishedBuffer()
@@ -113,13 +112,12 @@
 
 	size_t TOverlappedWriter::GetBufferCount() const
 	{
-		return m_tFailedWriteBuffers.GetCount() + m_tFinishedBuffers.GetCount();
+		return m_tFinishedBuffers.GetCount();
 	}
 
 	void TOverlappedWriter::ReleaseBuffers(const TBufferListPtr& spList)
 	{
 		m_tBuffersToWrite.ReleaseBuffers(spList);
-		m_tFailedWriteBuffers.ReleaseBuffers(spList);
 		m_tFinishedBuffers.ReleaseBuffers(spList);
 	}
 }
Index: src/libchcore/TOverlappedWriter.h
===================================================================
diff -u -rb6a48931b8155a01d871d050f52d915abb2df8ca -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TOverlappedWriter.h	(.../TOverlappedWriter.h)	(revision b6a48931b8155a01d871d050f52d915abb2df8ca)
+++ src/libchcore/TOverlappedWriter.h	(.../TOverlappedWriter.h)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -22,7 +22,6 @@
 #include "../liblogger/TLogFileData.h"
 #include "../liblogger/TLogger.h"
 #include "TOrderedBufferQueue.h"
-#include "TFailedBufferQueue.h"
 #include "TWriteBufferQueueWrapper.h"
 #include "TBufferList.h"
 
@@ -56,7 +55,7 @@
 
 		// event access
 		HANDLE GetEventWritePossibleHandle() const { return m_tBuffersToWrite.GetHasBuffersEvent(); }
-		HANDLE GetEventWriteFailedHandle() const { return m_tFailedWriteBuffers.GetHasBuffersEvent(); }
+		HANDLE GetEventWriteFailedHandle() const { return m_tFinishedBuffers.GetHasErrorEvent(); }
 		HANDLE GetEventWriteFinishedHandle() const { return m_tFinishedBuffers.GetHasBuffersEvent(); }
 
 		size_t GetBufferCount() const;
@@ -66,8 +65,6 @@
 		logger::TLoggerPtr m_spLog;
 
 		TWriteBufferQueueWrapper m_tBuffersToWrite;
-
-		TFailedBufferQueue m_tFailedWriteBuffers;
 		TOrderedBufferQueue m_tFinishedBuffers;
 
 		bool m_bDataWritingFinished = false;	// output file was already written to the end
Index: src/libchcore/TSimpleOrderedBufferQueue.h
===================================================================
diff -u -r41ec2475aac7f653bac96300af7b1bd111640134 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/TSimpleOrderedBufferQueue.h	(.../TSimpleOrderedBufferQueue.h)	(revision 41ec2475aac7f653bac96300af7b1bd111640134)
+++ src/libchcore/TSimpleOrderedBufferQueue.h	(.../TSimpleOrderedBufferQueue.h)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -33,7 +33,8 @@
 		{
 			if(!pBuffer)
 				throw TCoreException(eErr_InvalidArgument, L"pBuffer is NULL", LOCATION);
-			insert(pBuffer);
+			if(!insert(pBuffer).second)
+				throw TCoreException(eErr_InvalidArgument, L"Buffer already exists in the collection", LOCATION);
 		}
 
 		TOverlappedDataBuffer* Pop()
Fisheye: Tag c4cbf6cd567821f9a981586ab5d8294a26f873be refers to a dead (removed) revision in file `src/libchcore/Tests/TFailedBufferQueueTests.cpp'.
Fisheye: No comparison available.  Pass `N' to diff?
Index: src/libchcore/Tests/TOrderedBufferQueueTests.cpp
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/Tests/TOrderedBufferQueueTests.cpp	(.../TOrderedBufferQueueTests.cpp)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/Tests/TOrderedBufferQueueTests.cpp	(.../TOrderedBufferQueueTests.cpp)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -5,6 +5,15 @@
 #include "../GTestMacros.h"
 #include "../TCoreException.h"
 
+class FallbackCollection : public std::vector<chcore::TOverlappedDataBuffer*>
+{
+public:
+	void Push(chcore::TOverlappedDataBuffer* pBuffer, bool /*bKeepPos*/)
+	{
+		push_back(pBuffer);
+	}
+};
+
 using namespace chcore;
 
 ///////////////////////////////////////////////////////////////////////////////////////////
@@ -107,3 +116,142 @@
 
 	EXPECT_EQ(1, spReleaseList->GetCount());
 }
+
+///////////////////////////////////////////////////////////////////////////////////////////
+// failed buffers
+
+///////////////////////////////////////////////////////////////////////////////
+// Construction tests
+
+TEST(TOrderedBufferQueueTests, ConstructionSanityTest)
+{
+	TOrderedBufferQueue queue(0);
+
+	EXPECT_EQ(0, queue.GetCount());
+	EXPECT_TIMEOUT(queue.GetHasErrorEvent());
+	EXPECT_EQ(true, queue.IsEmpty());
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// PushBuffer tests
+
+TEST(TOrderedBufferQueueTests, PushBuffer_FirstFailure)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer(4096, nullptr);
+	buffer.SetErrorCode(123);
+
+	FallbackCollection collection;
+
+	queue.PushError(&buffer, collection);
+	EXPECT_EQ(1, queue.GetCount());
+	EXPECT_SIGNALED(queue.GetHasErrorEvent());
+	EXPECT_EQ(true, collection.empty());
+}
+
+TEST(TOrderedBufferQueueTests, PushBuffer_TwoSubsequentFailures)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(4096, nullptr);
+	TOverlappedDataBuffer buffer2(4096, nullptr);
+	buffer1.SetFilePosition(0);
+	buffer1.SetErrorCode(123);
+	buffer2.SetFilePosition(1000);
+	buffer2.SetErrorCode(234);
+
+	FallbackCollection collection;
+
+	queue.PushError(&buffer1, collection);
+	queue.PushError(&buffer2, collection);
+
+	EXPECT_EQ(1, queue.GetCount());
+	EXPECT_SIGNALED(queue.GetHasErrorEvent());
+	EXPECT_EQ(1, collection.size());
+	EXPECT_EQ(&buffer2, collection.front());
+	EXPECT_EQ(1000, collection.front()->GetFilePosition());
+	EXPECT_EQ(234, collection.front()->GetErrorCode());
+}
+
+TEST(TOrderedBufferQueueTests, PushBuffer_TwoFailuresOutOfOrder)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(4096, nullptr);
+	TOverlappedDataBuffer buffer2(4096, nullptr);
+	buffer1.SetFilePosition(0);
+	buffer1.SetErrorCode(123);
+	buffer2.SetFilePosition(1000);
+	buffer2.SetErrorCode(234);
+
+	FallbackCollection collection;
+
+	queue.PushError(&buffer2, collection);
+	queue.PushError(&buffer1, collection);
+
+	EXPECT_EQ(1, queue.GetCount());
+	EXPECT_SIGNALED(queue.GetHasErrorEvent());
+	EXPECT_EQ(1, collection.size());
+	EXPECT_EQ(&buffer2, collection.front());
+	EXPECT_EQ(1000, collection.front()->GetFilePosition());
+	EXPECT_EQ(234, collection.front()->GetErrorCode());
+}
+
+TEST(TOrderedBufferQueueTests, PushBuffer_ThrowOnNonErrorBuffer)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(4096, nullptr);
+	buffer1.SetFilePosition(0);
+	buffer1.SetErrorCode(ERROR_SUCCESS);
+
+	FallbackCollection collection;
+
+	EXPECT_THROW(queue.PushError(&buffer1, collection), TCoreException);
+}
+
+TEST(TOrderedBufferQueueTests, PushBuffer_WithSamePosition)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(4096, nullptr);
+	TOverlappedDataBuffer buffer2(4096, nullptr);
+	buffer1.SetFilePosition(1000);
+	buffer1.SetErrorCode(123);
+	buffer2.SetFilePosition(1000);
+	buffer2.SetErrorCode(234);
+
+	FallbackCollection collection;
+
+	queue.PushError(&buffer1, collection);
+	EXPECT_THROW(queue.PushError(&buffer2, collection), TCoreException);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Pop tests
+
+TEST(TOrderedBufferQueueTests, PopBuffer_EmptyContainer)
+{
+	TOrderedBufferQueue queue(0);
+	EXPECT_EQ(nullptr, queue.Pop());
+}
+
+TEST(TOrderedBufferQueueTests, PopBuffer_WithSamePosition)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(4096, nullptr);
+	TOverlappedDataBuffer buffer2(4096, nullptr);
+	TOverlappedDataBuffer buffer3(4096, nullptr);
+	buffer1.SetFilePosition(0);
+	buffer1.SetErrorCode(123);
+	buffer2.SetFilePosition(1000);
+	buffer2.SetErrorCode(234);
+
+	FallbackCollection collection;
+
+	queue.PushError(&buffer1, collection);
+	queue.PopError();
+
+	EXPECT_EQ(0, collection.size());
+	EXPECT_TIMEOUT(queue.GetHasErrorEvent());
+
+	queue.PushError(&buffer2, collection);
+	EXPECT_EQ(0, queue.GetCount());
+	EXPECT_EQ(1, collection.size());
+}
Index: src/libchcore/Tests/TSimpleOrderedBufferQueueTests.cpp
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/Tests/TSimpleOrderedBufferQueueTests.cpp	(.../TSimpleOrderedBufferQueueTests.cpp)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/Tests/TSimpleOrderedBufferQueueTests.cpp	(.../TSimpleOrderedBufferQueueTests.cpp)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -7,7 +7,7 @@
 using namespace chcore;
 
 // no expected position mode
-TEST(TSimpleOrderedBufferQueueTests, NoExpectedPos_ConstructionSanityTest)
+TEST(TSimpleOrderedBufferQueueTests, ConstructionSanityTest)
 {
 	TSimpleOrderedBufferQueue queue;
 
@@ -16,7 +16,7 @@
 	EXPECT_EQ(nullptr, queue.Peek());
 }
 
-TEST(TSimpleOrderedBufferQueueTests, NoExpectedPos_Push)
+TEST(TSimpleOrderedBufferQueueTests, Push)
 {
 	TSimpleOrderedBufferQueue queue;
 	TOverlappedDataBuffer buffer(1024, nullptr);
@@ -28,20 +28,29 @@
 	EXPECT_EQ(&buffer, queue.Peek());
 }
 
-TEST(TSimpleOrderedBufferQueueTests, NoExpectedPos_Pop)
+TEST(TSimpleOrderedBufferQueueTests, PushDuplicate)
 {
 	TSimpleOrderedBufferQueue queue;
 	TOverlappedDataBuffer buffer(1024, nullptr);
 
 	queue.Push(&buffer);
+	EXPECT_THROW(queue.Push(&buffer), TCoreException);
+}
+
+TEST(TSimpleOrderedBufferQueueTests, Pop)
+{
+	TSimpleOrderedBufferQueue queue;
+	TOverlappedDataBuffer buffer(1024, nullptr);
+
+	queue.Push(&buffer);
 	EXPECT_EQ(&buffer, queue.Pop());
 
 	EXPECT_EQ(0, queue.size());
 	EXPECT_EQ(true, queue.empty());
 	EXPECT_EQ(nullptr, queue.Peek());
 }
 
-TEST(TSimpleOrderedBufferQueueTests, NoExpectedPos_Clear)
+TEST(TSimpleOrderedBufferQueueTests, Clear)
 {
 	TSimpleOrderedBufferQueue queue;
 	TOverlappedDataBuffer buffer(1024, nullptr);
@@ -54,7 +63,7 @@
 	EXPECT_EQ(nullptr, queue.Peek());
 }
 
-TEST(TSimpleOrderedBufferQueueTests, NoExpectedPos_ReleaseBuffers)
+TEST(TSimpleOrderedBufferQueueTests, ReleaseBuffers)
 {
 	TSimpleOrderedBufferQueue queue;
 	TBufferListPtr spReleaseList(std::make_shared<TBufferList>());
Index: src/libchcore/libchcore.vc140.vcxproj
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -494,7 +494,6 @@
     <ClInclude Include="TCoreWin32Exception.h" />
     <ClInclude Include="TDestinationPathProvider.h" />
     <ClInclude Include="TEvent.h" />
-    <ClInclude Include="TFailedBufferQueue.h" />
     <ClInclude Include="TFakeFileSerializer.h" />
     <ClInclude Include="TFeedbackHandlerBase.h" />
     <ClInclude Include="TFeedbackHandlerWrapper.h" />
@@ -744,12 +743,6 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="Tests\TFailedBufferQueueTests.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
-    </ClCompile>
     <ClCompile Include="Tests\TOrderedBufferQueueTests.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
@@ -805,7 +798,6 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="TEvent.cpp" />
-    <ClCompile Include="TFailedBufferQueue.cpp" />
     <ClCompile Include="TFakeFileSerializer.cpp" />
     <ClCompile Include="TFeedbackResult.cpp" />
     <ClCompile Include="TFilesystemFeedbackWrapper.cpp" />
Index: src/libchcore/libchcore.vc140.vcxproj.filters
===================================================================
diff -u -rda7737de7046ba0ecd255240fb36b4a46584ebf2 -rc4cbf6cd567821f9a981586ab5d8294a26f873be
--- src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision da7737de7046ba0ecd255240fb36b4a46584ebf2)
+++ src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision c4cbf6cd567821f9a981586ab5d8294a26f873be)
@@ -479,9 +479,6 @@
     <ClInclude Include="TBufferList.h">
       <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
     </ClInclude>
-    <ClInclude Include="TFailedBufferQueue.h">
-      <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
-    </ClInclude>
     <ClInclude Include="TOrderedBufferQueue.h">
       <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
     </ClInclude>
@@ -880,9 +877,6 @@
     <ClCompile Include="TBufferList.cpp">
       <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
     </ClCompile>
-    <ClCompile Include="TFailedBufferQueue.cpp">
-      <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
-    </ClCompile>
     <ClCompile Include="TOrderedBufferQueue.cpp">
       <Filter>Source Files\Tools\Data Buffer\Queues</Filter>
     </ClCompile>
@@ -913,9 +907,6 @@
     <ClCompile Include="Tests\OverlappedCallbacksTests.cpp">
       <Filter>Tests\DataBuffer</Filter>
     </ClCompile>
-    <ClCompile Include="Tests\TFailedBufferQueueTests.cpp">
-      <Filter>Tests\DataBuffer</Filter>
-    </ClCompile>
     <ClCompile Include="Tests\TOrderedBufferQueueTests.cpp">
       <Filter>Tests\DataBuffer</Filter>
     </ClCompile>