12using namespace Microsoft::VisualStudio::CppUnitTestFramework;
19 TEST_CLASS_INITIALIZE (ClassInitialize)
21 Logger::WriteMessage (
"VirtualMemoryTest class initialize.\n");
24 TEST_CLASS_CLEANUP (ClassCleanup)
26 Logger::WriteMessage (
"VirtualMemoryTest class cleanup.\n");
29 TEST_METHOD_INITIALIZE (MethodInitialize)
33 _dwPageSize = si.dwPageSize;
35 message.
Format (_T (
"PageSize is %d\n"), _dwPageSize);
36 Logger::WriteMessage (
"VirtualMemoryTest method initialize.\n");
39 TEST_METHOD_CLEANUP (MethodCleanup)
41 Logger::WriteMessage (
"VirtualMemoryTest method cleanup.\n");
45 TEST_METHOD (VirtualMemory1Test1)
49 SIZE_T
size = (SIZE_T)_dwPageSize * 20;
50 message.
Format (_T (
"PageSize=%d size=%d\n"), _dwPageSize,
size);
51 Logger::WriteMessage (message.
Ctr ());
54 Assert::IsNotNull (lpvMem, _T(
"Allocate() failed.\n"));
56 FillMemory (lpvMem,
size,
'A');
58 Assert::IsTrue(memory->
Free (lpvMem), _T(
"Free() failed.\n"));
63 TEST_METHOD (VirtualMemoryTest1)
68 SIZE_T
size = (SIZE_T)(1024 * 1024 * 10);
70 LPBYTE lpbyMemReserve =
static_cast<LPBYTE
>(memory->
Reserve (
size));
71 Assert::IsNotNull (lpbyMemReserve, _T(
"Reserve() failed.\n"));
72 message.
Format (_T (
"Reserved address is %08X\n"), lpbyMemReserve);
73 Logger::WriteMessage (message.
Ctr ());
75 SIZE_T chunkSize = SIZE_T(1024 * 1024);
77 LPBYTE lpbyOffset1 =
static_cast<LPBYTE
>(lpbyMemReserve);
78 LPBYTE lpbyMemCommit1 =
static_cast<LPBYTE
>(memory->
Commit (lpbyOffset1, chunkSize));
79 Assert::IsNotNull (lpbyMemCommit1, _T(
"Commit(1) failed.\n"));
80 message.
Format (_T (
"Committed address1 is %08X\n"), lpbyMemCommit1);
81 Logger::WriteMessage (message.
Ctr ());
83 FillMemory (lpbyMemCommit1, chunkSize,
'A');
85 LPBYTE lpbyOffset2 =
static_cast<LPBYTE
>(lpbyMemReserve + chunkSize);
86 LPBYTE lpbyMemCommit2 =
static_cast<LPBYTE
>(memory->
Commit (lpbyOffset2, chunkSize));
87 Assert::IsNotNull (lpbyMemCommit1, _T(
"Commit(2) failed.\n"));
88 message.
Format (_T (
"Committed address2 is %08X\n"), lpbyMemCommit2);
89 Logger::WriteMessage (message.
Ctr ());
91 FillMemory (lpbyMemCommit2, chunkSize,
'B');
93 ret = memory->
Decommit (lpbyMemCommit1, chunkSize);
94 Assert::IsTrue (ret, _T(
"Decommit(1) failed.\n"));
96 ret = memory->
Decommit (lpbyMemCommit2, chunkSize);
97 Assert::IsTrue (ret, _T(
"Decommit(2) failed.\n"));
99 ret = memory->
Release (lpbyMemReserve);
100 Assert::IsTrue (ret, _T(
"Release() failed.\n"));
106 const int counter = 100;
108 const int counter = 10000;
110 typedef std::function<LPBYTE (
int)> MemoryCreator;
111 typedef std::function<void (LPBYTE)> MemoryDeleter;
116 Parameters (
int size,
int count, MemoryCreator creator, MemoryDeleter deleter)
117 :iSize (
size), iCount (count), creator (creator), deleter (deleter)
121 MemoryCreator creator;
122 MemoryDeleter deleter;
125 void ByteMemTest (
int size,
int count, MemoryCreator creator, MemoryDeleter deleter)
128 Parameters params (
size, count, creator, deleter);
130 auto function = [](LPVOID lpvParam)->DWORD
132 Parameters* params = (Parameters*)lpvParam;
134 for (
int i = 0; i < params->iCount; i++)
136 LPBYTE lpbyMemory = params->creator (params->iSize);
137 BYTE data = (
'a' + (i % 20));
138 FillMemory (lpbyMemory, params->iSize, data);
139 Assert::AreEqual<BYTE> (data, lpbyMemory[params->iSize - 1], _T (
"character mismatched.\n"));
140 params->deleter (lpbyMemory);
146 for (
int i = 0; i < 10; i++)
148 thread[i].
Create (function, ¶ms);
151 HANDLE hThreads[10]{ 0,0,0,0,0,0,0,0,0,0 };
152 for (
int i = 0; i < 10; i++)
156 ::WaitForMultipleObjects (10, hThreads, TRUE, INFINITE);
162 MemoryCreator virtualCreator = [&](
int size)->LPBYTE {
return (LPBYTE)vMemory.
Allocate (
size); };
163 MemoryDeleter virtualDeleter = [&](LPBYTE lpbyData)->
void { vMemory.
Free (lpbyData); };
165 TEST_METHOD (ByteMemTest_Virtual_512k)
167 ByteMemTest (1024 * 512, counter, virtualCreator, virtualDeleter);
170 TEST_METHOD (ByteMemTest_Virtual_1M)
172 ByteMemTest (1024 * 1024, counter, virtualCreator, virtualDeleter);
文字列に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
仮想メモリに関するWindowsAPIを集約したクラス
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
文字列に関するWindowsAPIを集約したクラス
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
スレッドに関するWindowsAPIを集約したクラス
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
static VOID APIENTRY GetSystemInfo(SYSTEM_INFO &systemInfo)
システム情報を取得します。
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
BOOL APIENTRY Decommit(LPVOID lpvMem, SIZE_T size) const
確定メモリの解除
LPVOID APIENTRY Commit(LPVOID lpvMem, SIZE_T size) const
予約メモリの確定
BOOL APIENTRY Release(LPVOID lpvMem) const
仮想メモリの予約開放
LPVOID APIENTRY Reserve(SIZE_T size) const
仮想メモリの予約