Index: src/libchcore/IOverlappedDataBufferQueue.cpp =================================================================== diff -u -N --- src/libchcore/IOverlappedDataBufferQueue.cpp (revision 0) +++ src/libchcore/IOverlappedDataBufferQueue.cpp (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -0,0 +1,28 @@ +// ============================================================================ +// Copyright (C) 2001-2015 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#include "stdafx.h" +#include "IOverlappedDataBufferQueue.h" + +BEGIN_CHCORE_NAMESPACE + +IOverlappedDataBufferQueue::~IOverlappedDataBufferQueue() +{ +} + +END_CHCORE_NAMESPACE Index: src/libchcore/TLocalFilesystem.cpp =================================================================== diff -u -N -r6103ac74583f2136b821dc67515ed8469abd8155 -rea7d62521e78371cff90579749d136cb928c9e88 --- src/libchcore/TLocalFilesystem.cpp (.../TLocalFilesystem.cpp) (revision 6103ac74583f2136b821dc67515ed8469abd8155) +++ src/libchcore/TLocalFilesystem.cpp (.../TLocalFilesystem.cpp) (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -388,12 +388,17 @@ Close(); } +DWORD TLocalFilesystemFile::GetFlagsAndAttributes(bool bNoBuffering) const +{ + return FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0); +} + bool TLocalFilesystemFile::OpenExistingForReading(const TSmartPath& pathFile, bool bNoBuffering) { Close(); m_pathFile = TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile); - m_hFile = ::CreateFile(m_pathFile.ToString(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL); + m_hFile = ::CreateFile(m_pathFile.ToString(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, GetFlagsAndAttributes(bNoBuffering), NULL); if(m_hFile == INVALID_HANDLE_VALUE) return false; @@ -406,7 +411,7 @@ Close(); m_pathFile = TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile); - m_hFile = ::CreateFile(m_pathFile.ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL); + m_hFile = ::CreateFile(m_pathFile.ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, GetFlagsAndAttributes(bNoBuffering), NULL); if(m_hFile == INVALID_HANDLE_VALUE) return false; @@ -419,7 +424,7 @@ Close(); m_pathFile = TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile); - m_hFile = CreateFile(m_pathFile.ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL); + m_hFile = CreateFile(m_pathFile.ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, GetFlagsAndAttributes(bNoBuffering), NULL); if(m_hFile == INVALID_HANDLE_VALUE) return false; Index: src/libchcore/TLocalFilesystem.h =================================================================== diff -u -N -r6103ac74583f2136b821dc67515ed8469abd8155 -rea7d62521e78371cff90579749d136cb928c9e88 --- src/libchcore/TLocalFilesystem.h (.../TLocalFilesystem.h) (revision 6103ac74583f2136b821dc67515ed8469abd8155) +++ src/libchcore/TLocalFilesystem.h (.../TLocalFilesystem.h) (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -131,6 +131,7 @@ private: TLocalFilesystemFile(); + DWORD GetFlagsAndAttributes(bool bNoBuffering) const; private: TSmartPath m_pathFile; Index: src/libchcore/TSubTaskCopyMove.cpp =================================================================== diff -u -N -r6103ac74583f2136b821dc67515ed8469abd8155 -rea7d62521e78371cff90579749d136cb928c9e88 --- src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision 6103ac74583f2136b821dc67515ed8469abd8155) +++ src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -291,23 +291,18 @@ return TSubTaskBase::eSubResult_Continue; // copying - TBufferSizes::EBufferType eBufferIndex = TBufferSizes::eBuffer_Default; - // recreate buffer if needed AdjustBufferIfNeeded(pData->dbBuffer, pData->tBufferSizes); pData->dbBuffer.DataSourceChanged(); // establish count of data to read - eBufferIndex = GetBufferIndex(pData->tBufferSizes, pData->spSrcFile); + TBufferSizes::EBufferType eBufferIndex = GetBufferIndex(pData->tBufferSizes, pData->spSrcFile); m_tSubTaskStats.SetCurrentBufferIndex(eBufferIndex); DWORD dwToRead = RoundUp(pData->tBufferSizes.GetSizeByType(eBufferIndex), TLocalFilesystemFile::MaxSectorSize); // read data from file to buffer - enum - { - eKillThread = 0, eWriteFinished, eWritePossible, eReadPossible, eHandleCount - }; + enum { eKillThread = 0, eWriteFinished, eWritePossible, eReadPossible, eHandleCount }; std::array arrHandles = { rThreadController.GetKillThreadHandle(), pData->dbBuffer.GetEventWriteFinishedHandle(), @@ -337,9 +332,9 @@ case WAIT_OBJECT_0 + eReadPossible: { - ATLTRACE(_T("Read possible\n")); TOverlappedDataBuffer* pBuffer = pData->dbBuffer.GetEmptyBuffer(); - if(!pBuffer) + ATLTRACE(_T("Read possible with buffer %p\n"), pBuffer); + if (!pBuffer) THROW_CORE_EXCEPTION(eErr_InternalProblem); pBuffer->SetFilePosition(ullNextReadPos); @@ -362,9 +357,9 @@ } case WAIT_OBJECT_0 + eWritePossible: { - ATLTRACE(_T("Write possible\n")); TOverlappedDataBuffer* pBuffer = pData->dbBuffer.GetFullBuffer(); - if(!pBuffer) + ATLTRACE(_T("Write possible with buffer %p\n"), pBuffer); + if (!pBuffer) THROW_CORE_EXCEPTION(eErr_InternalProblem); // was there an error reported? @@ -421,9 +416,9 @@ case WAIT_OBJECT_0 + eWriteFinished: { - ATLTRACE(_T("Write finished\n")); TOverlappedDataBuffer* pBuffer = pData->dbBuffer.GetFinishedBuffer(); - if(!pBuffer) + ATLTRACE(_T("Write finished with buffer %p\n"), pBuffer); + if (!pBuffer) THROW_CORE_EXCEPTION(eErr_InternalProblem); if(pBuffer->GetStatusCode() != ERROR_SUCCESS) @@ -707,7 +702,7 @@ rLog.logi(strFormat.c_str()); - rBuffer.ReinitializeBuffers(2, rBufferSizes.GetMaxSize()); + rBuffer.ReinitializeBuffers(5, rBufferSizes.GetMaxSize()); return true; // buffer adjusted } Index: src/libchcore/Tests/TestsTDataBufferManager.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) +++ src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 0) @@ -1,312 +0,0 @@ -#include "stdafx.h" -#include "gtest/gtest.h" -#include "gmock/gmock.h" -#include "../TDataBuffer.h" -#include "../TCoreException.h" - -// fixtures -class BasicBufferFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - size_t stMaxMemory = 1048034; - - chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory); - tBufferManager.Initialize(stMaxMemory); - } - - chcore::TDataBufferManager tBufferManager; -}; - -class DetailedBufferFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - size_t stMaxMemory = 1048034; - size_t stPageSize = 262144; - size_t stBufferSize = 65536; - - chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory, stPageSize, stBufferSize); - - tBufferManager.Initialize(stMaxMemory, stPageSize, stBufferSize); - } - - chcore::TDataBufferManager tBufferManager; -}; - -/////////////////////////////////////////////////////////////////////////////// -// TSimpleDataBuffer - -TEST(TSimpleDataBuffer, GetBufferPtr) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_EQ(tDataBuffer.GetBufferPtr(), (LPVOID)NULL); -} - -TEST(TSimpleDataBuffer, ReleaseBuffer) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_NO_FATAL_FAILURE(tDataBuffer.ReleaseBuffer()); -} - - -TEST(TSimpleDataBuffer, GetSetDataSize) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_EQ(tDataBuffer.GetDataSize(), 0); - EXPECT_THROW(tDataBuffer.SetDataSize(4273), chcore::TCoreException); - EXPECT_EQ(tDataBuffer.GetDataSize(), 0); -} - - -TEST(TSimpleDataBuffer, CutDataFromBuffer) -{ - chcore::TSimpleDataBuffer tDataBuffer; - - EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(7344)); - EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(0)); -} - -/////////////////////////////////////////////////////////////////////////////// -// TDataBufferManager - -TEST(TDataBufferManager, CheckBufferConfigBase) -{ - // only max mem - default values - size_t stMaxMem(0); - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); - EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); - - const size_t stTestSize = 103145; - stMaxMem = stTestSize; - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); - EXPECT_LE(stTestSize, stMaxMem); -} - -TEST(TDataBufferManager, CheckBufferConfigExt) -{ - // detailed config - default values - size_t stMaxMem(0); - size_t stPageSize(0); - size_t stChunkSize(0); - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); - EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); - EXPECT_EQ(stPageSize, chcore::TDataBufferManager::DefaultPageSize); - EXPECT_EQ(stChunkSize, chcore::TDataBufferManager::DefaultBufferSize); - - const size_t stTestMaxSize = 1237645; - const size_t stTestPageSize = 34563; - const size_t stTestBufferSize = 120; - stMaxMem = stTestMaxSize; - stPageSize = stTestPageSize; - stChunkSize = stTestBufferSize; - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); - EXPECT_LE(stTestMaxSize, stMaxMem); - EXPECT_LE(stTestPageSize, stPageSize); - EXPECT_LE(stTestBufferSize, stChunkSize); -} - -TEST(TDataBufferManager, FailedInitializations) -{ - chcore::TDataBufferManager tBufferManager; - - // failed initializations - EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory - 1), chcore::TCoreException); - EXPECT_EQ(tBufferManager.IsInitialized(), false); - - EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory, chcore::TDataBufferManager::DefaultPageSize - 1, - chcore::TDataBufferManager::DefaultBufferSize), chcore::TCoreException); - EXPECT_EQ(tBufferManager.IsInitialized(), false); - - // succeeded initialization - EXPECT_NO_FATAL_FAILURE(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultPageSize)); - EXPECT_EQ(tBufferManager.IsInitialized(), true); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), chcore::TDataBufferManager::DefaultPageSize); -} - -TEST_F(BasicBufferFixture, FailedResize) -{ - EXPECT_TRUE(tBufferManager.IsInitialized()); - - size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); - size_t stCurrentPageSize = tBufferManager.GetPageSize(); - size_t stCurrentBufferSize = tBufferManager.GetSimpleBufferSize(); - - // try to change to something useless, check if nothing breaks inside - EXPECT_THROW(tBufferManager.ChangeMaxMemorySize(0), chcore::TCoreException); - EXPECT_EQ(stCurrentMaxSize ,tBufferManager.GetMaxMemorySize()); - EXPECT_EQ(stCurrentPageSize, tBufferManager.GetPageSize()); - EXPECT_EQ(stCurrentBufferSize, tBufferManager.GetSimpleBufferSize()); -} - -TEST_F(BasicBufferFixture, ResizeToSameSizeWithSimpleBufferChecks) -{ - EXPECT_TRUE(tBufferManager.IsInitialized()); - EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); - - size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); - - // try to change to something useless, check if nothing breaks inside - size_t stNewBufferSize = stCurrentMaxSize / 2; - tBufferManager.CheckResizeSize(stNewBufferSize); // can't assume that it will return true here, since we don't really know what's the buffer size now... - - EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewBufferSize)); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), stNewBufferSize); - - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); -} - -TEST_F(DetailedBufferFixture, SmallBufferOperations) -{ - // get a single buffer, check internals - chcore::TSimpleDataBuffer tBuffer; - EXPECT_TRUE(tBufferManager.GetFreeBuffer(tBuffer)); - EXPECT_EQ(tBuffer.GetDataSize(), 0); - EXPECT_EQ(tBuffer.GetBufferSize(), 65536); - - // check whether there are still free buffers inside manager - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 15); -} - -TEST_F(DetailedBufferFixture, WithoutAdditionalAllocTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - std::vector vBuffers; - // get first 4 buffers and check state - for(size_t stIndex = 0; stIndex < 4; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 12); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - } - - // check that everything was freed - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); -} - -TEST_F(DetailedBufferFixture, FullBufferTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - // retrieve all the buffers that are inside - std::vector vBuffers; - for(size_t stIndex = 0; stIndex < 16; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - // ensure everything was taken - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_FALSE(tBufferManager.HasFreeBuffer()); - - // try to get one more buffer - chcore::TSimpleDataBuffer tFailBuffer; - EXPECT_FALSE(tBufferManager.GetFreeBuffer(tFailBuffer)); - } - - // ensure everything was freed as expected - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 16); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); -} - -TEST_F(DetailedBufferFixture, FullBufferWithResizeTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - // get all buffers - std::vector vBuffers; - for(size_t stIndex = 0; stIndex < 16; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - // now resize to quarter the size - size_t stNewSize = 262144; - tBufferManager.CheckResizeSize(stNewSize); - EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewSize)); - - // since all of the memory was already taken, there was no real freeing - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_FALSE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); // only a single page is available - - // get rid of the small buffers (except for one) - for(size_t stIndex = 0; stIndex < 15; ++stIndex) - { - vBuffers.erase(vBuffers.end() - 1); - } - - // now only one page should be left - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 3); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); - } - - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 4); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); -} - -/* -static bool CheckBufferConfig(size_t& stMaxMemory, size_t& stPageSize, size_t& stBufferSize); -static bool CheckBufferConfig(size_t& stMaxMemory); - -// initialization -void Initialize(size_t stMaxMemory); -void Initialize(size_t stMaxMemory, size_t stPageSize, size_t stBufferSize); -bool IsInitialized() const; - -bool CheckResizeSize(size_t& stNewMaxSize); -void ChangeMaxMemorySize(size_t stNewMaxSize); - -// current settings -size_t GetMaxMemorySize() const { return m_stMaxMemory; } -size_t GetPageSize() const { return m_stPageSize; } -size_t GetSimpleBufferSize() const { return m_stBufferSize; } - -size_t GetRealAllocatedMemorySize() const; - -// buffer retrieval -bool HasFreeBuffer() const; // checks if a buffer is available without allocating any new memory -size_t GetCountOfFreeBuffers() const; // how many free buffers are there that can be used without allocating additional memory - -bool GetFreeBuffer(TSimpleDataBuffer& rSimpleBuffer); -void ReleaseBuffer(TSimpleDataBuffer& rSimpleBuffer); -*/ Index: src/libchcore/libchcore.vc120.vcxproj =================================================================== diff -u -N -r6103ac74583f2136b821dc67515ed8469abd8155 -rea7d62521e78371cff90579749d136cb928c9e88 --- src/libchcore/libchcore.vc120.vcxproj (.../libchcore.vc120.vcxproj) (revision 6103ac74583f2136b821dc67515ed8469abd8155) +++ src/libchcore/libchcore.vc120.vcxproj (.../libchcore.vc120.vcxproj) (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -643,12 +643,6 @@ true true - - true - true - true - true - true true Index: src/libchcore/libchcore.vc120.vcxproj.filters =================================================================== diff -u -N -r6103ac74583f2136b821dc67515ed8469abd8155 -rea7d62521e78371cff90579749d136cb928c9e88 --- src/libchcore/libchcore.vc120.vcxproj.filters (.../libchcore.vc120.vcxproj.filters) (revision 6103ac74583f2136b821dc67515ed8469abd8155) +++ src/libchcore/libchcore.vc120.vcxproj.filters (.../libchcore.vc120.vcxproj.filters) (revision ea7d62521e78371cff90579749d136cb928c9e88) @@ -592,9 +592,6 @@ Source Files\Tools - - Tests - Tests