Improve handling of buffer

This commit is contained in:
Danny Daemonic 2023-05-02 15:38:00 -07:00
parent fa82549c60
commit 4aa91a230a

View file

@ -18,6 +18,7 @@
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define NOMINMAX #define NOMINMAX
#include <windows.h> #include <windows.h>
#include <intrin.h>
#include <fcntl.h> #include <fcntl.h>
#include <io.h> #include <io.h>
#define CP_UTF8 65001 #define CP_UTF8 65001
@ -53,14 +54,13 @@ int32_t get_num_physical_cores() {
return num_physical_cores; return num_physical_cores;
} }
#elif defined(_WIN32) #elif defined(_WIN32)
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *buffer = nullptr;
DWORD length = 0;
// Call GetLogicalProcessorInformationEx with a nullptr buffer to get the required buffer length // Call GetLogicalProcessorInformationEx with a nullptr buffer to get the required buffer length
DWORD length = 0;
GetLogicalProcessorInformationEx(RelationAll, nullptr, &length); GetLogicalProcessorInformationEx(RelationAll, nullptr, &length);
// Allocate memory for the buffer // Allocate memory for the buffer
buffer = reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(new char[length]); std::unique_ptr<char[]> buffer_ptr(new char[length]);
char* buffer = buffer_ptr.get();
// Things to count // Things to count
unsigned int physical_cores = 0; unsigned int physical_cores = 0;
@ -71,11 +71,14 @@ int32_t get_num_physical_cores() {
unsigned int logical_efficiency_cores = 0; unsigned int logical_efficiency_cores = 0;
// Call GetLogicalProcessorInformationEx again with the allocated buffer // Call GetLogicalProcessorInformationEx again with the allocated buffer
if (GetLogicalProcessorInformationEx(RelationAll, buffer, &length)) { if (GetLogicalProcessorInformationEx(
RelationAll,
reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(buffer),
&length)) {
DWORD offset = 0; DWORD offset = 0;
while (offset < length) { while (offset < length) {
auto info = reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(reinterpret_cast<char *>(buffer) + offset); auto info = reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(buffer + offset);
if (info->Relationship == RelationProcessorCore) { if (info->Relationship == RelationProcessorCore) {
physical_cores += info->Processor.GroupCount; physical_cores += info->Processor.GroupCount;
@ -111,8 +114,6 @@ int32_t get_num_physical_cores() {
fprintf(stderr, "Failed to get processor information. Error: %u\n", GetLastError()); fprintf(stderr, "Failed to get processor information. Error: %u\n", GetLastError());
} }
delete[] buffer;
if (physical_performance_cores > 0) { if (physical_performance_cores > 0) {
return static_cast<int32_t>(physical_performance_cores); return static_cast<int32_t>(physical_performance_cores);
} else if (physical_cores > 0) { } else if (physical_cores > 0) {