Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
HeapMemoryTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "HeapMemory.h"
8#include "TString.h"
9#include "Thread.h"
10
11using namespace Microsoft::VisualStudio::CppUnitTestFramework;
12
13namespace WindowsLibraryTest
14{
15 TEST_CLASS (HeapMemoryTest)
16 {
17 public:
18 TEST_CLASS_INITIALIZE (ClassInitialize)
19 {
20 Logger::WriteMessage ("HeapMemoryTest class initialize.\n");
21 }
22
23 TEST_CLASS_CLEANUP (ClassCleanup)
24 {
25 Logger::WriteMessage ("HeapMemoryTest class cleanup.\n");
26 }
27
28 TEST_METHOD_INITIALIZE (MethodInitialize)
29 {
30 Logger::WriteMessage ("HeapMemoryTest method initialize.\n");
31 }
32
33 TEST_METHOD_CLEANUP (MethodCleanup)
34 {
35 Logger::WriteMessage ("HeapMemoryTest method cleanup.\n");
36 }
37
38 TEST_METHOD (HeapMemoryBasicTest)
39 {
40 alt::HeapMemory memory;
41 Assert::IsTrue(memory.Create ());
42
43 for (char n = 'A'; n < 'Z'; n++)
44 {
45 for (int i = 0; i < 100; i++)
46 {
47 auto mem = memory.Allocate (100);
48 Assert::IsNotNull (mem);
49 FillMemory (mem, 100, n);
50 Assert::IsTrue(memory.Free (mem));
51 }
52 Assert::IsTrue(memory.Compact ());
53 }
54
55 Assert::IsTrue(memory.Close ());
56 }
57
58#ifdef _DEBUG
59 const int counter = 100;
60#else
61 const int counter = 10000;
62#endif
63 typedef std::function<LPBYTE (int)> MemoryCreator;
64 typedef std::function<void (LPBYTE)> MemoryDeleter;
65
66 class Parameters
67 {
68 public:
69 Parameters (int size, int count, MemoryCreator creator, MemoryDeleter deleter)
70 :iSize (size), iCount (count), creator (creator), deleter (deleter)
71 {};
72 int iSize;
73 int iCount;
74 MemoryCreator creator;
75 MemoryDeleter deleter;
76 };
77
78 void ByteMemTest (int size, int count, MemoryCreator creator, MemoryDeleter deleter)
79 {
80 alt::Thread* thread = new alt::Thread[10];
81 Parameters params (size, count, creator, deleter);
82
83 auto function = [](LPVOID lpvParam)->DWORD
84 {
85 Parameters* params = (Parameters*)lpvParam;
86
87 for (int i = 0; i < params->iCount; i++)
88 {
89 LPBYTE lpbyMemory = params->creator (params->iSize);
90 BYTE data = ('a' + (i % 20));
91 FillMemory (lpbyMemory, params->iSize, data);
92 Assert::AreEqual<BYTE> (data, lpbyMemory[params->iSize - 1], _T ("character mismatched.\n"));
93 params->deleter (lpbyMemory);
94 }
95
96 return true;
97 };
98
99 for (int i = 0; i < 10; i++)
100 {
101 thread[i].Create (function, &params);
102 }
103
104 HANDLE hThreads[10]{ 0,0,0,0,0,0,0,0,0,0 };
105 for (int i = 0; i < 10; i++)
106 {
107 hThreads[i] = thread[i].GetHandle ();
108 }
109 ::WaitForMultipleObjects (10, hThreads, TRUE, INFINITE);
110
111 for (int i = 0; i < 10; i++)
112 {
113 thread[i].Close ();
114 }
115
116 delete[] thread;
117 }
118
119 MemoryCreator newCreator = [](int size)->LPBYTE { return new BYTE[size]; };
120 MemoryDeleter newDeleter = [](LPBYTE lpbyData)->void { delete lpbyData; };
121
122 TEST_METHOD (ByteMemTest_New____16)
123 {
124 ByteMemTest (16, counter, newCreator, newDeleter);
125 }
126
127 TEST_METHOD (ByteMemTest_New____64)
128 {
129 ByteMemTest (64, counter, newCreator, newDeleter);
130 }
131
132 TEST_METHOD (ByteMemTest_New___256)
133 {
134 ByteMemTest (256, counter, newCreator, newDeleter);
135 }
136
137 TEST_METHOD (ByteMemTest_New__1024)
138 {
139 ByteMemTest (1024, counter, newCreator, newDeleter);
140 }
141
142 TEST_METHOD (ByteMemTest_New__4096)
143 {
144 ByteMemTest (4096, counter, newCreator, newDeleter);
145 }
146
147 TEST_METHOD (ByteMemTest_New_16384)
148 {
149 ByteMemTest (16384, counter, newCreator, newDeleter);
150 }
151
152 TEST_METHOD (ByteMemTest_New_512k)
153 {
154 ByteMemTest (1024 * 512, counter, newCreator, newDeleter);
155 }
156
157 alt::BasicMemory basicMemory;
158 MemoryCreator basicCreator = [&](int size)->LPBYTE { return (LPBYTE)basicMemory.Allocate (size,0); };
159 MemoryDeleter basicDeleter = [&](LPBYTE lpbyData)->void { basicMemory.Free (lpbyData); };
160
161 TEST_METHOD (ByteMemTest_Basic____16)
162 {
163 ByteMemTest (16, counter, basicCreator, basicDeleter);
164 }
165
166 TEST_METHOD (ByteMemTest_Basic____64)
167 {
168 ByteMemTest (64, counter, basicCreator, basicDeleter);
169 }
170
171 TEST_METHOD (ByteMemTest_Basic___256)
172 {
173 ByteMemTest (256, counter, basicCreator, basicDeleter);
174 }
175
176 TEST_METHOD (ByteMemTest_Basic__1024)
177 {
178 ByteMemTest (1024, counter, basicCreator, basicDeleter);
179 }
180
181 TEST_METHOD (ByteMemTest_Basic__4096)
182 {
183 ByteMemTest (4096, counter, basicCreator, basicDeleter);
184 }
185
186 TEST_METHOD (ByteMemTest_Basic_16384)
187 {
188 ByteMemTest (16384, counter, basicCreator, basicDeleter);
189 }
190
191 TEST_METHOD (ByteMemTest_Basic_512k)
192 {
193 ByteMemTest (1024 * 512, counter, basicCreator, basicDeleter);
194 }
195
196 alt::HeapMemory* heapMemory;
197 MemoryCreator heapCreator = [&](int size)->LPBYTE { return (LPBYTE)heapMemory->Allocate (size,0); };
198 MemoryDeleter heapDeleter = [&](LPBYTE lpbyData)->void { heapMemory->Free (lpbyData); };
199
200 TEST_METHOD (ByteMemTest_SystemHeap____16)
201 {
202 heapMemory = new alt::HeapMemory();
203 Assert::IsTrue (heapMemory->Open ());
204 ByteMemTest (16, counter, heapCreator, heapDeleter);
205 Assert::IsTrue (heapMemory->Close ());
206 delete heapMemory;
207 }
208
209 TEST_METHOD (ByteMemTest_SystemHeap____64)
210 {
211 heapMemory = new alt::HeapMemory();
212 Assert::IsTrue(heapMemory->Open());
213 ByteMemTest(64, counter, heapCreator, heapDeleter);
214 Assert::IsTrue(heapMemory->Close());
215 delete heapMemory;
216 }
217
218 TEST_METHOD (ByteMemTest_SystemHeap___256)
219 {
220 heapMemory = new alt::HeapMemory();
221 Assert::IsTrue(heapMemory->Open());
222 ByteMemTest(256, counter, heapCreator, heapDeleter);
223 Assert::IsTrue(heapMemory->Close());
224 delete heapMemory;
225 }
226
227 TEST_METHOD (ByteMemTest_SystemHeap__1024)
228 {
229 heapMemory = new alt::HeapMemory();
230 Assert::IsTrue(heapMemory->Open());
231 ByteMemTest(1024, counter, heapCreator, heapDeleter);
232 Assert::IsTrue(heapMemory->Close());
233 delete heapMemory;
234 }
235
236 TEST_METHOD (ByteMemTest_SystemHeap__4096)
237 {
238 heapMemory = new alt::HeapMemory();
239 Assert::IsTrue(heapMemory->Open());
240 ByteMemTest(4096, counter, heapCreator, heapDeleter);
241 Assert::IsTrue(heapMemory->Close());
242 delete heapMemory;
243 }
244
245 TEST_METHOD (ByteMemTest_SystemHeap_16384)
246 {
247 heapMemory = new alt::HeapMemory();
248 Assert::IsTrue(heapMemory->Open());
249 ByteMemTest(16384, counter, heapCreator, heapDeleter);
250 Assert::IsTrue(heapMemory->Close());
251 delete heapMemory;
252 }
253
254 TEST_METHOD (ByteMemTest_SystemHeap_512k)
255 {
256 heapMemory = new alt::HeapMemory();
257 Assert::IsTrue(heapMemory->Open());
258 ByteMemTest(1024 * 512, counter, heapCreator, heapDeleter);
259 Assert::IsTrue(heapMemory->Close());
260 delete heapMemory;
261 }
262
263 TEST_METHOD (ByteMemTest_UserHeap____16)
264 {
265 heapMemory = new alt::HeapMemory();
266 Assert::IsTrue(heapMemory->Create());
267 ByteMemTest(16, counter, heapCreator, heapDeleter);
268 Assert::IsTrue(heapMemory->Close());
269 delete heapMemory;
270 }
271
272 TEST_METHOD (ByteMemTest_UserHeap____64)
273 {
274 heapMemory = new alt::HeapMemory();
275 Assert::IsTrue(heapMemory->Create());
276 ByteMemTest(64, counter, heapCreator, heapDeleter);
277 Assert::IsTrue(heapMemory->Close());
278 delete heapMemory;
279 }
280
281 TEST_METHOD (ByteMemTest_UserHeap___256)
282 {
283 heapMemory = new alt::HeapMemory();
284 Assert::IsTrue(heapMemory->Create());
285 ByteMemTest(256, counter, heapCreator, heapDeleter);
286 Assert::IsTrue(heapMemory->Close());
287 delete heapMemory;
288 }
289
290 TEST_METHOD (ByteMemTest_UserHeap__1024)
291 {
292 heapMemory = new alt::HeapMemory();
293 Assert::IsTrue(heapMemory->Create());
294 ByteMemTest(1024, counter, heapCreator, heapDeleter);
295 Assert::IsTrue(heapMemory->Close());
296 delete heapMemory;
297 }
298
299 TEST_METHOD (ByteMemTest_UserHeap__4096)
300 {
301 heapMemory = new alt::HeapMemory();
302 Assert::IsTrue(heapMemory->Create());
303 ByteMemTest(4096, counter, heapCreator, heapDeleter);
304 Assert::IsTrue(heapMemory->Close());
305 delete heapMemory;
306 }
307
308 TEST_METHOD (ByteMemTest_UserHeap_16384)
309 {
310 heapMemory = new alt::HeapMemory();
311 Assert::IsTrue(heapMemory->Create());
312 ByteMemTest(16384, counter, heapCreator, heapDeleter);
313 Assert::IsTrue(heapMemory->Close());
314 delete heapMemory;
315 }
316
317 TEST_METHOD (ByteMemTest_UserHeap_512k)
318 {
319 heapMemory = new alt::HeapMemory();
320 Assert::IsTrue(heapMemory->Create());
321 ByteMemTest(1024 * 512, counter, heapCreator, heapDeleter);
322 Assert::IsTrue(heapMemory->Close());
323 delete heapMemory;
324 }
325
326 TEST_METHOD (HeapReallocTest)
327 {
328 alt::TString message;
329 alt::HeapMemory memory;
330 BOOL ret = memory.Create ();
331 Assert::IsTrue (ret, _T ("HeapMemory::Create() failed.\n"));
332
333 int allocSize = 1024;
334 message.Format (_T ("now allocSize is %d\n"), allocSize);
335 Logger::WriteMessage (message.Ctr ());
336
337 char* lpszMemory = static_cast<char*>(memory.Allocate (allocSize));
338 FillMemory (lpszMemory, allocSize, 'a');
339
340 for (int i = 0; i < 100; i++)
341 {
342 allocSize += 1024;
343 message.Format (_T ("now allocSize is %d\n"), allocSize);
344 Logger::WriteMessage (message.Ctr ());
345
346 lpszMemory = static_cast<char*>(memory.Reallocate (lpszMemory, allocSize));
347 FillMemory (lpszMemory, allocSize, ('a' + i));
348
349 Assert::AreEqual<char> (('a' + i), lpszMemory[allocSize - 1], _T ("character mismatched.\n"));
350 }
351
352 ret = memory.Free (lpszMemory);
353 Assert::IsTrue (ret, _T ("HeapMemory::Free() failed.\n"));
354
355 ret = memory.Close();
356 Assert::IsTrue (ret, _T ("HeapMemory::Close() failed.\n"));
357 }
358 };
359}
ヒープメモリに関するAPIを集約したクラス
文字列に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
#define size
プリコンパイル済みヘッダー ファイルです。
malloc/realloc/freeを使った標準的なメモリクラス
Definition: HeapMemory.h:17
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
Definition: HeapMemory.cpp:14
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
Definition: HeapMemory.cpp:34
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
ヒープメモリに関するAPIを集約したクラス
Definition: HeapMemory.h:46
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
Definition: HeapMemory.cpp:130
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
Definition: HeapMemory.cpp:115
SIZE_T APIENTRY Compact() const
取得したヒープ領域の整理
Definition: HeapMemory.cpp:110
virtual LPVOID APIENTRY Reallocate(LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
取得メモリの拡大
Definition: HeapMemory.cpp:120
BOOL APIENTRY Create(SIZE_T initialSize=0, SIZE_T maximumSize=0, DWORD dwOptions=0)
ヒープ領域の取得
Definition: HeapMemory.cpp:56
BOOL APIENTRY Close()
取得したヒープ領域の解放
Definition: HeapMemory.cpp:95
BOOL APIENTRY Open()
システムヒープ領域の取得
Definition: HeapMemory.cpp:87
文字列に関するWindowsAPIを集約したクラス
Definition: TString.h:17
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
Definition: TString.cpp:333
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:46
スレッドに関するWindowsAPIを集約したクラス
Definition: Thread.h:43
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
Definition: Thread.cpp:24
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19