Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
VirtualMemoryTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "VirtualMemory.h"
8#include "Thread.h"
9#include "TString.h"
10#include "Utility.h"
11
12using namespace Microsoft::VisualStudio::CppUnitTestFramework;
13
14namespace WindowsLibraryTest
15{
16 TEST_CLASS (VirtualMemoryTest)
17 {
18 public:
19 TEST_CLASS_INITIALIZE (ClassInitialize)
20 {
21 Logger::WriteMessage ("VirtualMemoryTest class initialize.\n");
22 }
23
24 TEST_CLASS_CLEANUP (ClassCleanup)
25 {
26 Logger::WriteMessage ("VirtualMemoryTest class cleanup.\n");
27 }
28
29 TEST_METHOD_INITIALIZE (MethodInitialize)
30 {
31 SYSTEM_INFO si;
33 _dwPageSize = si.dwPageSize;
34 alt::TString message;
35 message.Format (_T ("PageSize is %d\n"), _dwPageSize);
36 Logger::WriteMessage ("VirtualMemoryTest method initialize.\n");
37 }
38
39 TEST_METHOD_CLEANUP (MethodCleanup)
40 {
41 Logger::WriteMessage ("VirtualMemoryTest method cleanup.\n");
42 }
43
44 DWORD _dwPageSize; // Initialized by 'METHOD_INITIALIZE'.
45 TEST_METHOD (VirtualMemory1Test1)
46 {
47 alt::TString message;
49 SIZE_T size = (SIZE_T)_dwPageSize * 20;
50 message.Format (_T ("PageSize=%d size=%d\n"), _dwPageSize, size);
51 Logger::WriteMessage (message.Ctr ());
52
53 LPVOID lpvMem = memory->Allocate (size);
54 Assert::IsNotNull (lpvMem, _T("Allocate() failed.\n"));
55
56 FillMemory (lpvMem, size, 'A');
57
58 Assert::IsTrue(memory->Free (lpvMem), _T("Free() failed.\n"));
59
60 delete memory;
61 }
62
63 TEST_METHOD (VirtualMemoryTest1)
64 {
65 BOOL ret;
66 alt::TString message;
68 SIZE_T size = (SIZE_T)(1024 * 1024 * 10);
69
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 ());
74
75 SIZE_T chunkSize = SIZE_T(1024 * 1024);
76
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 ());
82
83 FillMemory (lpbyMemCommit1, chunkSize, 'A');
84
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 ());
90
91 FillMemory (lpbyMemCommit2, chunkSize, 'B');
92
93 ret = memory->Decommit (lpbyMemCommit1, chunkSize);
94 Assert::IsTrue (ret, _T("Decommit(1) failed.\n"));
95
96 ret = memory->Decommit (lpbyMemCommit2, chunkSize);
97 Assert::IsTrue (ret, _T("Decommit(2) failed.\n"));
98
99 ret = memory->Release (lpbyMemReserve);
100 Assert::IsTrue (ret, _T("Release() failed.\n"));
101
102 delete memory;
103 }
104
105#ifdef _DEBUG
106 const int counter = 100;
107#else
108 const int counter = 10000;
109#endif
110 typedef std::function<LPBYTE (int)> MemoryCreator;
111 typedef std::function<void (LPBYTE)> MemoryDeleter;
112
113 class Parameters
114 {
115 public:
116 Parameters (int size, int count, MemoryCreator creator, MemoryDeleter deleter)
117 :iSize (size), iCount (count), creator (creator), deleter (deleter)
118 {};
119 int iSize;
120 int iCount;
121 MemoryCreator creator;
122 MemoryDeleter deleter;
123 };
124
125 void ByteMemTest (int size, int count, MemoryCreator creator, MemoryDeleter deleter)
126 {
127 alt::Thread* thread = new alt::Thread[10];
128 Parameters params (size, count, creator, deleter);
129
130 auto function = [](LPVOID lpvParam)->DWORD
131 {
132 Parameters* params = (Parameters*)lpvParam;
133
134 for (int i = 0; i < params->iCount; i++)
135 {
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);
141 }
142
143 return true;
144 };
145
146 for (int i = 0; i < 10; i++)
147 {
148 thread[i].Create (function, &params);
149 }
150
151 HANDLE hThreads[10]{ 0,0,0,0,0,0,0,0,0,0 };
152 for (int i = 0; i < 10; i++)
153 {
154 hThreads[i] = thread[i].GetHandle ();
155 }
156 ::WaitForMultipleObjects (10, hThreads, TRUE, INFINITE);
157
158 delete[] thread;
159 }
160
161 alt::VirtualMemory1 vMemory;
162 MemoryCreator virtualCreator = [&](int size)->LPBYTE { return (LPBYTE)vMemory.Allocate (size); };
163 MemoryDeleter virtualDeleter = [&](LPBYTE lpbyData)->void { vMemory.Free (lpbyData); };
164
165 TEST_METHOD (ByteMemTest_Virtual_512k)
166 {
167 ByteMemTest (1024 * 512, counter, virtualCreator, virtualDeleter);
168 }
169
170 TEST_METHOD (ByteMemTest_Virtual_1M)
171 {
172 ByteMemTest (1024 * 1024, counter, virtualCreator, virtualDeleter);
173 }
174 };
175}
文字列に関するWindowsAPIを集約したクラス
スレッドに関するWindowsAPIを集約したクラス
#define size
汎用的に使えるユーティリティクラス
仮想メモリに関するWindowsAPIを集約したクラス
プリコンパイル済みヘッダー ファイルです。
HANDLE APIENTRY GetHandle() const
継承先はこの関数でハンドルを取得します。
文字列に関する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
static VOID APIENTRY GetSystemInfo(SYSTEM_INFO &systemInfo)
システム情報を取得します。
Definition: Utility.cpp:93
仮想メモリの取得・解放を簡易的に実装したクラス
Definition: VirtualMemory.h:17
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
仮想メモリに関するクラス
Definition: VirtualMemory.h:52
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
仮想メモリの予約
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19