[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Ovirt-devel] [PATCH matahari] Replaces the existing HAL code for ProcessorAgent with udev.



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 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]