Skip to content

Commit 89b41c0

Browse files
author
Martin Pietsch
committed
add modes for seperate reading of virtual and working memory
1 parent a755213 commit 89b41c0

4 files changed

Lines changed: 64 additions & 56 deletions

File tree

src/PIAbstractProcessInfoReader.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ namespace ProcessInfo
1212
{
1313
static constexpr uint8_t Commandline = 1;
1414
static constexpr uint8_t CPULoad = 2;
15-
static constexpr uint8_t Memory = 4;
16-
static constexpr uint8_t ParentPID = 8;
15+
static constexpr uint8_t ParentPID = 4;
16+
static constexpr uint8_t VirtualMemory = 8;
17+
static constexpr uint8_t WorkingMemory = 16;
18+
static constexpr uint8_t Memory = WorkingMemory | VirtualMemory;
1719
static constexpr uint8_t All = Commandline | CPULoad | Memory | ParentPID;
1820
};
1921

src/PILinuxProcessInfoReader.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ bool PILinuxProcessInfoReader::readData(PIProcessInfo& pData, ReadMode pMode)
3737

3838
if(lRetval)
3939
{
40-
if((pMode & ReadModeFlags::Memory) == ReadModeFlags::Memory)
40+
if((pMode & ReadModeFlags::WorkingMemory) == ReadModeFlags::WorkingMemory)
4141
{ {
42-
pData.mMemoryVirtual = std::stoull(mStatusFileData["VmSize"]) * 1000;
4342
pData.mMemoryResident = std::stoull(mStatusFileData["VmRSS"]) * 1000;
44-
pData.mMemorySwapped = std::stoull(mStatusFileData["VmSwap"]) * 1000;
43+
pData.mMemorySwapped = std::stoull(mStatusFileData["VmSwap"]) * 1000;
44+
}
45+
46+
if((pMode & ReadModeFlags::VirtualMemory) == ReadModeFlags::VirtualMemory)
47+
{
48+
pData.mMemoryVirtual = std::stoull(mStatusFileData["VmSize"]) * 1000;
4549
}
4650

4751
if((pMode & ReadModeFlags::ParentPID) == ReadModeFlags::ParentPID)

src/PIWindowsProcessInfoReader.cpp

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,42 +40,41 @@ PIWindowsProcessInfoReader::PIWindowsProcessInfoReader(int64_t pProcessID)
4040
bool PIWindowsProcessInfoReader::readData(PIProcessInfo& pData, ReadMode pMode)
4141
{
4242
HANDLE lProcess = getProcessHandle();
43-
bool lRetval = false;
43+
bool lRetVal = false;
4444

4545
if(lProcess)
4646
{
47-
lRetval = PIAbstractProcessInfoReader::readData(pData, pMode);
47+
lRetVal = PIAbstractProcessInfoReader::readData(pData, pMode);
4848

4949
if((pMode & ReadModeFlags::Commandline) == ReadModeFlags::Commandline)
5050
{
51-
lRetval &= readCommandLine(lProcess, pData);
51+
lRetVal &= readCommandLine(lProcess, pData);
5252
}
5353

54-
if ((pMode & ReadModeFlags::CPULoad) == ReadModeFlags::CPULoad)
54+
if((pMode & ReadModeFlags::CPULoad) == ReadModeFlags::CPULoad)
5555
{
5656
pData.mCPULoad = calculateCPULoad(lProcess);
5757
}
5858

59-
if ((pMode & ReadModeFlags::Memory) == ReadModeFlags::Memory)
59+
if((pMode & ReadModeFlags::Memory) != 0)
6060
{
61-
lRetval &= readMemoryData(lProcess, pData);
61+
lRetVal &= readMemoryData(lProcess, pData, pMode);
6262
}
6363

6464
if((pMode & ReadModeFlags::ParentPID) == ReadModeFlags::ParentPID)
6565
{
66-
lRetval &= readParentProcessID(lProcess, pData);
66+
lRetVal &= readParentProcessID(lProcess, pData);
6767
}
6868

6969
CloseHandle(lProcess);
7070
}
7171

72-
return lRetval;
72+
return lRetVal;
7373
}
7474

7575
/*private methods*/
7676
double PIWindowsProcessInfoReader::calculateCPULoad(HANDLE pProcess)
7777
{
78-
double lRetval = 0.0;
7978
FILETIME lFTime, lFSysTime, lFUserTime;
8079
ULARGE_INTEGER lNowTime, lSysTime, lUserTime;
8180

@@ -86,16 +85,16 @@ double PIWindowsProcessInfoReader::calculateCPULoad(HANDLE pProcess)
8685
std::memcpy(&lUserTime, &lFUserTime, sizeof(FILETIME));
8786
std::memcpy(&lSysTime, &lFSysTime, sizeof(FILETIME));
8887

89-
lRetval = static_cast<double>((lSysTime.QuadPart - mLastSysCPUTime.QuadPart) +
88+
double lRetVal = static_cast<double>(lSysTime.QuadPart - mLastSysCPUTime.QuadPart +
9089
(lUserTime.QuadPart - mLastUserCPUTime.QuadPart));
91-
lRetval /= (lNowTime.QuadPart - mLastCPUTime.QuadPart);
92-
lRetval /= mProcessorCount;
90+
lRetVal /= static_cast<double>(lNowTime.QuadPart - mLastCPUTime.QuadPart);
91+
lRetVal /= mProcessorCount;
9392

9493
mLastCPUTime = lNowTime;
9594
mLastSysCPUTime = lSysTime;
9695
mLastUserCPUTime = lUserTime;
9796

98-
return lRetval * 100.0;
97+
return lRetVal * 100.0;
9998
}
10099

101100
HANDLE PIWindowsProcessInfoReader::getProcessHandle() const
@@ -108,15 +107,14 @@ HANDLE PIWindowsProcessInfoReader::getProcessHandle() const
108107
return OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, mProcessID);
109108
}
110109

111-
bool PIWindowsProcessInfoReader::readCommandLine(HANDLE pProcess, PIProcessInfo& pData)
110+
bool PIWindowsProcessInfoReader::readCommandLine(HANDLE pProcess, PIProcessInfo& pData) const
112111
{
113112
pData.mCmdLine = "";
114113

115-
UNICODE_STRING *lCommandLineBuffer;
116114
ULONG lBufferSize = 0;
117115

118116
lBufferSize = sizeof(UNICODE_STRING) + MAX_PATH;
119-
lCommandLineBuffer = static_cast<UNICODE_STRING*>(std::malloc(lBufferSize));
117+
UNICODE_STRING* lCommandLineBuffer = static_cast<UNICODE_STRING*>(std::malloc(lBufferSize));
120118

121119
NTSTATUS lStatus = NtQueryInformationProcess(pProcess, ProcessCommandLineInformation, lCommandLineBuffer, lBufferSize, &lBufferSize);
122120

@@ -140,9 +138,9 @@ bool PIWindowsProcessInfoReader::readCommandLine(HANDLE pProcess, PIProcessInfo&
140138
return false;
141139
}
142140

143-
int lStrLen = WideCharToMultiByte(CP_UTF8, 0, lCommandLineBuffer->Buffer, lCommandLineBuffer->Length, NULL, 0, NULL, NULL) + 1;
141+
int lStrLen = WideCharToMultiByte(CP_UTF8, 0, lCommandLineBuffer->Buffer, lCommandLineBuffer->Length, nullptr, 0, nullptr, nullptr) + 1;
144142
char* lMbString = static_cast<char*>(std::calloc(lStrLen, sizeof(char)));
145-
WideCharToMultiByte(CP_UTF8, 0, lCommandLineBuffer->Buffer, -1, lMbString, lStrLen, NULL, NULL);
143+
WideCharToMultiByte(CP_UTF8, 0, lCommandLineBuffer->Buffer, -1, lMbString, lStrLen, nullptr, nullptr);
146144

147145
pData.mCmdLine = lMbString;
148146

@@ -152,39 +150,46 @@ bool PIWindowsProcessInfoReader::readCommandLine(HANDLE pProcess, PIProcessInfo&
152150
return true;
153151
}
154152

155-
bool PIWindowsProcessInfoReader::readMemoryData(HANDLE pProcess, PIProcessInfo& pData)
153+
bool PIWindowsProcessInfoReader::readMemoryData(HANDLE pProcess, PIProcessInfo& pData, ReadMode pMode) const
156154
{
157-
PROCESS_MEMORY_COUNTERS_EX2 lProcMemCounters;
158-
159-
if(GetProcessMemoryInfo(pProcess, (PROCESS_MEMORY_COUNTERS*)&lProcMemCounters, sizeof(lProcMemCounters)))
160-
{
161-
pData.mMemoryResident = lProcMemCounters.WorkingSetSize;
162-
pData.mMemorySwapped = lProcMemCounters.PagefileUsage;
163-
}
164-
else
165-
{
166-
return false;
167-
}
155+
bool lRetVal = true;
156+
157+
if((pMode & ReadModeFlags::WorkingMemory) == ReadModeFlags::WorkingMemory)
158+
{
159+
PROCESS_MEMORY_COUNTERS_EX2 lProcMemCounters;
160+
if(GetProcessMemoryInfo(pProcess, reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&lProcMemCounters), sizeof(lProcMemCounters)))
161+
{
162+
pData.mMemoryResident = lProcMemCounters.WorkingSetSize;
163+
pData.mMemorySwapped = lProcMemCounters.PagefileUsage;
164+
}
165+
else
166+
{
167+
lRetVal = false;
168+
}
169+
}
168170

169-
MEMORY_BASIC_INFORMATION lProcMemBaseInfo;
170-
SIZE_T lProcAddress = 0;
171-
SIZE_T lProcVirtualSize = 0;
172-
173-
while(VirtualQueryEx(pProcess, reinterpret_cast<LPCVOID>(lProcAddress), &lProcMemBaseInfo, sizeof(lProcMemBaseInfo)))
174-
{
175-
if(lProcMemBaseInfo.State == MEM_COMMIT or lProcMemBaseInfo.State == MEM_RESERVE)
171+
if((pMode & ReadModeFlags::VirtualMemory) == ReadModeFlags::VirtualMemory)
172+
{
173+
MEMORY_BASIC_INFORMATION lProcMemBaseInfo;
174+
SIZE_T lProcAddress = 0;
175+
SIZE_T lProcVirtualSize = 0;
176+
177+
while(VirtualQueryEx(pProcess, reinterpret_cast<LPCVOID>(lProcAddress), &lProcMemBaseInfo, sizeof(lProcMemBaseInfo)))
176178
{
177-
lProcVirtualSize += lProcMemBaseInfo.RegionSize;
179+
if(lProcMemBaseInfo.State == MEM_COMMIT or lProcMemBaseInfo.State == MEM_RESERVE)
180+
{
181+
lProcVirtualSize += lProcMemBaseInfo.RegionSize;
182+
}
183+
lProcAddress += lProcMemBaseInfo.RegionSize;
178184
}
179-
lProcAddress += lProcMemBaseInfo.RegionSize;
180-
}
185+
186+
pData.mMemoryVirtual = lProcVirtualSize;
187+
}
181188

182-
pData.mMemoryVirtual = lProcVirtualSize;
183-
184-
return true;
189+
return lRetVal;
185190
}
186191

187-
bool PIWindowsProcessInfoReader::readParentProcessID(HANDLE pProcess, PIProcessInfo& pData)
192+
bool PIWindowsProcessInfoReader::readParentProcessID(HANDLE pProcess, PIProcessInfo& pData) const
188193
{
189194
PROCESS_BASIC_INFORMATION lPbi;
190195
ULONG lReturnLength;

src/PIWindowsProcessInfoReader.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
#define PI_WINDOWS_PROCESS_INFO_READER_H 1
33

44
#include <format>
5-
#include <map>
6-
#include <stdexcept>
7-
#include <string>
85

96
#include <windows.h>
107

@@ -23,14 +20,14 @@ namespace ProcessInfo
2320
private:
2421
double calculateCPULoad(HANDLE pProcess);
2522
HANDLE getProcessHandle() const;
26-
bool readCommandLine(HANDLE pProcess, PIProcessInfo& pData);
27-
bool readMemoryData(HANDLE pProcess, PIProcessInfo& pData);
28-
bool readParentProcessID(HANDLE pProcess, PIProcessInfo& pData);
23+
bool readCommandLine(HANDLE pProcess, PIProcessInfo& pData) const;
24+
bool readMemoryData(HANDLE pProcess, PIProcessInfo& pData, ReadMode pMode) const;
25+
bool readParentProcessID(HANDLE pProcess, PIProcessInfo& pData) const;
2926

3027
ULARGE_INTEGER mLastCPUTime;
3128
ULARGE_INTEGER mLastSysCPUTime;
3229
ULARGE_INTEGER mLastUserCPUTime;
33-
int mProcessorCount;
30+
uint32_t mProcessorCount;
3431
};
3532

3633
using PIProcessInfoReader = PIWindowsProcessInfoReader;

0 commit comments

Comments
 (0)