[Ovirt-devel] [PATCH matahari] Replaces the existing HAL code for ProcessorAgent with udev.
Darryl L. Pierce
dpierce at redhat.com
Mon Apr 19 18:42:31 UTC 2010
Stripped out the HAL support code and replaced with calls to udev. The
remainder of the code to extract CPU details parses through the
/proc/cpuinfo file since udev/sysfs will not return such information.
Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
configure.ac | 3 +-
src/Makefile.am | 4 +-
src/processors.cpp | 94 +++++++++++++++++++++++++++++++++++++++++----------
3 files changed, 79 insertions(+), 22 deletions(-)
diff --git a/configure.ac b/configure.ac
index 9102c66..c51c23e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,7 +8,7 @@ AM_INIT_AUTOMAKE
AC_PROG_CXX
AC_PROG_CC
AC_PROG_CPP
-AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/ioctl.h sys/socket.h unistd.h])
+AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/ioctl.h sys/socket.h unistd.h libudev.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
@@ -19,6 +19,7 @@ PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.2.12)
PKG_CHECK_MODULES(HAL, hal >= 0.5.12)
PKG_CHECK_MODULES(LIBVIRT, libvirt >= 0.6.2)
PKG_CHECK_MODULES(PCRE, libpcre >= 7.8)
+PKG_CHECK_MODULES(UDEV, libudev >= 145)
# Checks for library functions.
AC_CHECK_FUNCS([gethostname inet_ntoa socket])
diff --git a/src/Makefile.am b/src/Makefile.am
index ee30443..b4668b9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(HAL_CFLAGS) $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS)
+INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(HAL_CFLAGS) $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS) $(UDEV_CFLAGS)
sbin_PROGRAMS = matahari
@@ -41,6 +41,6 @@ CLEANFILES = $(generated_file_list) $(first)
matahari_CPPFLAGS = -fno-strict-aliasing
matahari_LDFLAGS = -L/usr/local/lib
-matahari_LDADD = -lqmf $(HAL_LIBS) $(LIBVIRT_LIBS) $(PCRE_LIBS)
+matahari_LDADD = -lqmf $(HAL_LIBS) $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS)
dist_pkgdata_DATA = schema.xml
diff --git a/src/processors.cpp b/src/processors.cpp
index 4317b1f..30a2837 100644
--- a/src/processors.cpp
+++ b/src/processors.cpp
@@ -17,25 +17,19 @@
* also available at http://www.gnu.org/copyleft/gpl.html.
*/
-#include <iostream>
+#include "processors.h"
#include <fstream>
-#include <sstream>
-#include <string>
-#include <vector>
-#include <stdexcept>
-
-#include <hal/libhal.h>
-
+#include <iostream>
#include <pcre.h>
-#include "hal.h"
-#include "processors.h"
+// TODO remove this wrapper once rhbz#583747 is fixed
+extern "C" {
+#include <libudev.h>
+}
using namespace std;
namespace _qmf = qmf::com::redhat::matahari;
-extern DBusError dbus_error;
-
void
ProcessorsAgent::setup(ManagementAgent* agent, Manageable* parent)
{
@@ -43,17 +37,79 @@ ProcessorsAgent::setup(ManagementAgent* agent, Manageable* parent)
management_object = new _qmf::Processors(agent, this, parent);
agent->addObject(management_object);
- LibHalContext* context = get_hal_ctx();
+ int core_count = 0;
+ string model = "unknown";
+
+ 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;
+
+ udev_list_entry_foreach(entry, entries)
+ {
+ core_count++;
+ }
+ }
+
+ udev_enumerate_unref(enumerator);
+ udev_unref(udev);
+
+ ifstream input("/proc/cpuinfo");
+ 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() && !done)
+ {
+ string line;
+
+ getline(input, line);
+ int match = pcre_exec(regex, NULL, line.c_str(), line.length(),
+ 0, PCRE_NOTEMPTY,found, expected * 3);
- int num_results;
- char** processors = libhal_find_device_by_capability(context,"processor", &num_results, &dbus_error);
+ if(match == expected)
+ {
+ string name = line.substr(found[2], found[3] - found[2]);
+ string value = line.substr(found[4], found[5] - found[4]);
- if (!processors)
- throw runtime_error("Error: could not query processors via HAL.");
+ // if we're at a second processor and we've already started, then we're done
+ if (name == "processor")
+ {
+ if (started)
+ {
+ done = true;
+ }
+ else
+ {
+ started = true;
+ }
+ }
+ else
+ {
+ if(name == "model name") model = value;
+ }
+ }
+ }
+ input.close();
+ }
// populate the managed object's values
- management_object->set_model(libhal_device_get_property_string(context, processors[0], "info.product", &dbus_error));
- management_object->set_cores(num_results);
+ management_object->set_model(model);
+ management_object->set_cores(core_count);
}
void
--
1.6.6.1
More information about the ovirt-devel
mailing list