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

Ian Main imain at redhat.com
Tue Apr 20 16:23:57 UTC 2010


On Mon, 2010-04-19 at 14:42 -0400, Darryl L. Pierce wrote:
> 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.

Your formatting is different from the rest of the codebase.. it's
getting all mixed up in there..

Otherwise ACK. :)

	Ian


> 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





More information about the ovirt-devel mailing list