Commit 63dbb0ca authored by Lemures Lemniscati's avatar Lemures Lemniscati Committed by Brad King
Browse files

SystemInformation: Improve CPU info lookup on Cygwin

Based on downstream patch from Cygwin package for CMake by Marco Atzeri:

* https://github.com/matzeri/cygwin-pkg/blob/64864eb8f0d635ea44226e4b9a41a7ca59a1c7dd/cmake/3.17.3-cpuinfo.patch

and a patch by Lemures Lemniscati

* https://sourceware.org/pipermail/cygwin/2020-July/245563.html
parent be39cd88
......@@ -863,7 +863,7 @@ void SystemInformation::RunMemoryCheck()
// Hide implementation details in an anonymous namespace.
namespace {
// *****************************************************************************
#if defined(__linux) || defined(__APPLE__)
#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__)
int LoadLines(FILE* file, std::vector<std::string>& lines)
{
// Load each line in the given file into a the vector.
......@@ -893,7 +893,7 @@ int LoadLines(FILE* file, std::vector<std::string>& lines)
return nRead;
}
# if defined(__linux)
# if defined(__linux) || defined(__CYGWIN__)
// *****************************************************************************
int LoadLines(const char* fileName, std::vector<std::string>& lines)
{
......@@ -926,7 +926,7 @@ int NameValue(std::vector<std::string> const& lines, std::string const& name,
}
#endif
#if defined(__linux)
#if defined(__linux) || defined(__CYGWIN__)
// ****************************************************************************
template <typename T>
int GetFieldsFromFile(const char* fileName, const char** fieldNames, T* values)
......@@ -3393,7 +3393,7 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
pos = buffer.find("processor\t", pos + 1);
}
#ifdef __linux
#if defined(__linux) || defined(__CYGWIN__)
// Count sockets.
std::set<int> PhysicalIDs;
std::string idc = this->ExtractValueFromCpuInfoFile(buffer, "physical id");
......@@ -3414,8 +3414,8 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
this->NumberOfPhysicalCPU =
NumberOfCoresPerSocket * (unsigned int)NumberOfSockets;
#else // __CYGWIN__
// does not have "physical id" entries, neither "cpu cores"
#else
// For systems which do not have "physical id" entries, neither "cpu cores"
// this has to be fixed for hyper-threading.
std::string cpucount =
this->ExtractValueFromCpuInfoFile(buffer, "cpu count");
......@@ -3597,7 +3597,7 @@ long long SystemInformationImplementation::GetHostMemoryTotal()
GlobalMemoryStatusEx(&statex);
return statex.ullTotalPhys / 1024;
# endif
#elif defined(__linux)
#elif defined(__linux) || defined(__CYGWIN__)
long long memTotal = 0;
int ierr = GetFieldFromFile("/proc/meminfo", "MemTotal:", memTotal);
if (ierr) {
......@@ -3712,6 +3712,16 @@ long long SystemInformationImplementation::GetHostMemoryUsed()
GlobalMemoryStatusEx(&statex);
return (statex.ullTotalPhys - statex.ullAvailPhys) / 1024;
# endif
#elif defined(__CYGWIN__)
const char* names[3] = { "MemTotal:", "MemFree:", nullptr };
long long values[2] = { 0 };
int ierr = GetFieldsFromFile("/proc/meminfo", names, values);
if (ierr) {
return ierr;
}
long long& memTotal = values[0];
long long& memFree = values[1];
return memTotal - memFree;
#elif defined(__linux)
// First try to use MemAvailable, but it only works on newer kernels
const char* names2[3] = { "MemTotal:", "MemAvailable:", nullptr };
......@@ -3773,7 +3783,7 @@ long long SystemInformationImplementation::GetProcMemoryUsed()
return -2;
}
return pmc.WorkingSetSize / 1024;
#elif defined(__linux)
#elif defined(__linux) || defined(__CYGWIN__)
long long memUsed = 0;
int ierr = GetFieldFromFile("/proc/self/status", "VmRSS:", memUsed);
if (ierr) {
......@@ -3850,7 +3860,8 @@ long long SystemInformationImplementation::GetProcessId()
#if defined(_WIN32)
return GetCurrentProcessId();
#elif defined(__linux) || defined(__APPLE__) || defined(__OpenBSD__) || \
defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \
defined(__CYGWIN__)
return getpid();
#else
return -1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment