The number of CPUs, the number of cores per CPU, and the CPU model code are consolidated into a single function on Linux.
Signed-off-by: Darryl L. Pierce dpierce@redhat.com --- src/host.cpp | 147 +++++++++++++++++++++++++------------------------ src/host.h | 2 + src/qmf/hostagent.cpp | 1 + 3 files changed, 77 insertions(+), 73 deletions(-)
diff --git a/src/host.cpp b/src/host.cpp index 8b6cd6f..d6955a5 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -36,6 +36,18 @@ extern "C" {
using namespace std;
+typedef struct cpuinfo_ +{ + static bool initialized; + string model; + unsigned int cpus; + unsigned int cores; +} cpuinfo_t; + +bool cpuinfo_t::initialized = false; + +cpuinfo_t cpuinfo; + set<HostListener*> _listeners; unsigned int _heartbeat_sequence;
@@ -186,105 +198,94 @@ host_get_memory() return memory; }
-string -host_get_cpu_model() +void +host_get_cpu_details() { - static string model; + if(cpuinfo.initialized) return;
- if(model.empty()) - { + cpuinfo.initialized = true;
-#ifdef __linux__ - ifstream* input = new ifstream("/proc/cpuinfo"); +#if __linux__ + ifstream input("/proc/cpuinfo");
- if(input->is_open()) + if(input.is_open()) + { + string regexstr = "(.*\S)\s*:\s*(\S.*)"; + int expected = 3; + int found[expected * 3]; + const char* pcre_error; + int pcre_error_offset; + pcre* regex; + bool done = false; + bool started = false; + + regex = pcre_compile(regexstr.c_str(), 0, &pcre_error, &pcre_error_offset, NULL); + if(!regex) { throw runtime_error("Unable to compile regular expression."); } + + while(!input.eof()) { - string regexstr = "(.*\S)\s*:\s*(\S.*)"; - int expected = 3; - int found[expected * 3]; - const char* pcre_error; - int pcre_error_offset; - pcre* regex; - bool done = false; - bool started = false; - - regex = pcre_compile(regexstr.c_str(), 0, &pcre_error, &pcre_error_offset, NULL); - if(!regex) { throw runtime_error("Unable to compile regular expression."); } - - while(!input->eof() && !done) - { - string line; + string line;
- getline(*input, line); - int match = pcre_exec(regex, NULL, line.c_str(), line.length(), - 0, PCRE_NOTEMPTY,found, expected * 3); + getline(input, line); + int match = pcre_exec(regex, NULL, line.c_str(), line.length(), + 0, PCRE_NOTEMPTY,found, expected * 3);
- if(match == expected) - { - string name = line.substr(found[2], found[3] - found[2]); - string value = line.substr(found[4], found[5] - found[4]); + if(match == expected) + { + string name = line.substr(found[2], found[3] - found[2]); + string value = line.substr(found[4], found[5] - found[4]);
- /* If we're at a second processor and we've already started, - then we're done. - */ - if (name == "processor") + /* If we're at a second processor and we've already started, + then we're done. + */ + if (name == "processor") + { + cpuinfo.cpus++; + if (started) { - if (started) - { - done = true; - } - else - { - started = true; - } + done = true; } else { - if(name == "model name") model = value; + started = true; } } + else if (!done) + { + if (name == "cpu cores") cpuinfo.cores = atoi(value.c_str()); + else if (name == "model name") cpuinfo.model = value; + } } - input->close(); - delete input; } -#endif - + input.close(); + cpuinfo.cpus /= cpuinfo.cores; } +#endif
- return model; }
-unsigned int -host_get_number_of_cpu_cores() +string +host_get_cpu_model() { - unsigned int cores = 0; - - if(!cores) - { + host_get_cpu_details();
-#ifdef __linux__ - struct udev* udev = udev_new(); - struct udev_enumerate* enumerator = udev_enumerate_new(udev); - - udev_enumerate_add_match_property(enumerator, "DRIVER", "processor"); - if(!udev_enumerate_scan_devices(enumerator)) - { - struct udev_list_entry* entries = udev_enumerate_get_list_entry(enumerator); - struct udev_list_entry* entry; + return cpuinfo.model; +}
- udev_list_entry_foreach(entry, entries) - { - cores++; - } - } +unsigned int +host_get_number_of_cpus() +{ + host_get_cpu_details();
- udev_enumerate_unref(enumerator); - udev_unref(udev); -#endif + return cpuinfo.cpus; +}
- } +unsigned int +host_get_number_of_cpu_cores() +{ + host_get_cpu_details();
- return cores; + return cpuinfo.cores; }
void diff --git a/src/host.h b/src/host.h index c9e97b2..574e8b5 100644 --- a/src/host.h +++ b/src/host.h @@ -45,6 +45,8 @@ unsigned int host_get_memory();
string host_get_cpu_model();
+unsigned int host_get_number_of_cpus(); + unsigned int host_get_number_of_cpu_cores();
void host_get_load_averages(double& one, double& five, double& fifteen); diff --git a/src/qmf/hostagent.cpp b/src/qmf/hostagent.cpp index cd6d0e6..0c0170c 100644 --- a/src/qmf/hostagent.cpp +++ b/src/qmf/hostagent.cpp @@ -47,6 +47,7 @@ HostAgent::setup(ManagementAgent* agent) _management_object->set_memory(host_get_memory());
_management_object->set_cpu_model(host_get_cpu_model()); + _management_object->set_cpu_count(host_get_number_of_cpus()); _management_object->set_cpu_cores(host_get_number_of_cpu_cores()); }