Index: src/libchcore/Tests/TReadBufferQueueWrapperTests.cpp
===================================================================
diff -u -r518d1a3484cde91ff17c071211df5e40cb3487e3 -rd99302fce795dbb5139659016a5da7948f141fb4
--- src/libchcore/Tests/TReadBufferQueueWrapperTests.cpp	(.../TReadBufferQueueWrapperTests.cpp)	(revision 518d1a3484cde91ff17c071211df5e40cb3487e3)
+++ src/libchcore/Tests/TReadBufferQueueWrapperTests.cpp	(.../TReadBufferQueueWrapperTests.cpp)	(revision d99302fce795dbb5139659016a5da7948f141fb4)
@@ -12,15 +12,17 @@
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
 
-	EXPECT_THROW(TReadBufferQueueWrapper(spList, 0, 0), TCoreException);
+	EXPECT_THROW(TReadBufferQueueWrapper(spList, 0, 0, 0, 0, nullptr, nullptr), TCoreException);
 }
 
 TEST(TReadBufferQueueWrapperTests, Constructor)
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
-	EXPECT_EQ(0, queue.GetCount());
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
+
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
 	EXPECT_TIMEOUT(queue.GetHasBuffersEvent());
 	EXPECT_EQ(false, queue.IsDataSourceFinished());
 }
@@ -29,8 +31,11 @@
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	EXPECT_EQ(nullptr, queue.Pop());
 }
 
@@ -46,8 +51,11 @@
 	spList->Push(&buffer3);
 	spList->Push(&buffer4);
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	EXPECT_EQ(&buffer4, queue.Pop());
 	EXPECT_EQ(0, buffer4.GetFilePosition());
 	EXPECT_EQ(1024, buffer4.GetRequestedDataSize());
@@ -70,8 +78,11 @@
 TEST(TReadBufferQueueWrapperTests, PushPop_ClaimedBuffers)
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	TOverlappedDataBuffer buffer1(1024, nullptr);
 	TOverlappedDataBuffer buffer2(1024, nullptr);
 	TOverlappedDataBuffer buffer3(1024, nullptr);
@@ -113,8 +124,11 @@
 	spList->Push(&buffer1);
 	spList->Push(&buffer2);
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	TOverlappedDataBuffer buffer3(1024, nullptr);
 	TOverlappedDataBuffer buffer4(1024, nullptr);
 	queue.PushEmpty(&buffer3);
@@ -156,7 +170,10 @@
 
 	spList->Push(&buffer1);
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
+
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
 	queue.SetDataSourceFinished(&buffer1);
 
 	EXPECT_EQ(true, queue.IsDataSourceFinished());
@@ -170,16 +187,22 @@
 	TOverlappedDataBuffer buffer1(1024, nullptr);
 	spList->Push(&buffer1);
 
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	EXPECT_THROW(queue.SetDataSourceFinished(&buffer1), TCoreException);
 }
 
 TEST(TReadBufferQueueWrapperTests, PushPop_DataSourceFinished_CheckBufferMaintenance)
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	TOverlappedDataBuffer buffer1(1024, nullptr);
 	buffer1.SetFilePosition(0);
 	buffer1.SetLastPart(true);
@@ -191,7 +214,6 @@
 
 	queue.SetDataSourceFinished(&buffer1);
 
-	EXPECT_EQ(2, queue.GetCount());
 	EXPECT_EQ(&buffer1, queue.Pop());
 
 	EXPECT_EQ(0, spList->GetCount());
@@ -201,22 +223,23 @@
 TEST(TReadBufferQueueWrapperTests, PushPop_DataSourceFinished_ValidPushAfterFinished)
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	TOverlappedDataBuffer buffer1(1024, nullptr);
 	buffer1.SetLastPart(true);
 	queue.Push(&buffer1);
 
 	queue.SetDataSourceFinished(&buffer1);
 
-	EXPECT_EQ(1, queue.GetCount());
 	EXPECT_EQ(0, spList->GetCount());
 
 	TOverlappedDataBuffer buffer2(1024, nullptr);
 	buffer2.SetLastPart(true);
 	queue.Push(&buffer2);
 
-	EXPECT_EQ(1, queue.GetCount());
 	EXPECT_EQ(&buffer1, queue.Pop());
 	EXPECT_EQ(1, spList->GetCount());
 	EXPECT_EQ(&buffer2, spList->Pop());
@@ -225,16 +248,18 @@
 TEST(TReadBufferQueueWrapperTests, PushPop_DataSourceFinished_InvalidPushAfterFinished)
 {
 	TBufferListPtr spList(std::make_shared<TBufferList>());
-	TReadBufferQueueWrapper queue(spList, 0, 1024);
+	TSharedCountPtr<size_t> spOtfBufferCount(std::make_shared<TSharedCount<size_t>>());
+	TSharedCountMTPtr<size_t> spReadAheadBufferCount(std::make_shared<TSharedCountMT<size_t>>());
 
+	TReadBufferQueueWrapper queue(spList, 0, 1024, 1, 1, spOtfBufferCount, spReadAheadBufferCount);
+
 	TOverlappedDataBuffer buffer1(1024, nullptr);
 	buffer1.SetLastPart(true);
 	buffer1.SetFilePosition(0);
 	queue.Push(&buffer1);
 
 	queue.SetDataSourceFinished(&buffer1);
 
-	EXPECT_EQ(1, queue.GetCount());
 	EXPECT_EQ(&buffer1, queue.Pop());
 	EXPECT_EQ(0, spList->GetCount());