[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