[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/solid/solid
From: Alex Merry <kde () randomguy3 ! me ! uk>
Date: 2010-11-26 17:45:11
Message-ID: 20101126174511.4083CAC8A2 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1201079 by alexmerry:
Report correct information for processors in Solid udev backend.
Review request: 5892
M +1 -0 CMakeLists.txt
M +1 -0 backends/shared/udevqt.h
M +13 -0 backends/shared/udevqtdevice.cpp
A backends/udev/cpuinfo.cpp [License: LGPL]
A backends/udev/cpuinfo.h [License: LGPL]
M +18 -2 backends/udev/udevdevice.cpp
M +1 -0 backends/udev/udevdevice.h
M +8 -2 backends/udev/udevmanager.cpp
M +39 -18 backends/udev/udevprocessor.cpp
M +9 -0 backends/udev/udevprocessor.h
--- trunk/KDE/kdelibs/solid/solid/CMakeLists.txt #1201078:1201079
@@ -176,6 +176,7 @@
backends/udev/udevmanager.cpp
backends/udev/udevdeviceinterface.cpp
backends/udev/udevgenericinterface.cpp
+ backends/udev/cpuinfo.cpp
backends/udev/udevprocessor.cpp
backends/udev/udevcamera.cpp
backends/udev/udevportablemediaplayer.cpp
--- trunk/KDE/kdelibs/solid/solid/backends/shared/udevqt.h #1201078:1201079
@@ -44,6 +44,7 @@
QString devType() const;
QString name() const;
QString sysfsPath() const;
+ int sysfsNumber() const;
QString driver() const;
QString primaryDeviceFile() const;
QStringList alternateDeviceSymlinks() const;
--- trunk/KDE/kdelibs/solid/solid/backends/shared/udevqtdevice.cpp #1201078:1201079
@@ -152,6 +152,19 @@
return QString::fromLatin1(udev_device_get_syspath(d->udev));
}
+int Device::sysfsNumber() const
+{
+ if (!d)
+ return -1;
+
+ QString value = QString::fromLatin1(udev_device_get_sysnum(d->udev));
+ bool success = false;
+ int number = value.toInt(&success);
+ if (success)
+ return number;
+ return -1;
+}
+
QString Device::driver() const
{
if (!d)
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevdevice.cpp #1201078:1201079
@@ -24,6 +24,7 @@
#include "udevprocessor.h"
#include "udevcamera.h"
#include "udevportablemediaplayer.h"
+#include "cpuinfo.h"
using namespace Solid::Backends::UDev;
@@ -49,13 +50,23 @@
QString UDevDevice::vendor() const
{
- return m_device.sysfsProperty("manufacturer").toString();
+ QString vendor = m_device.sysfsProperty("manufacturer").toString();
+ if (vendor.isEmpty() && queryDeviceInterface(Solid::DeviceInterface::Processor)) {
+ // sysfs doesn't have anything useful here
+ vendor = extractCpuInfoLine(deviceNumber(), "vendor_id\\s+:\\s+(\\S.+)");
}
+ return vendor;
+}
QString UDevDevice::product() const
{
- return m_device.sysfsProperty("product").toString();
+ QString product = m_device.sysfsProperty("product").toString();
+ if (product.isEmpty() && queryDeviceInterface(Solid::DeviceInterface::Processor)) {
+ // sysfs doesn't have anything useful here
+ product = extractCpuInfoLine(deviceNumber(), "model name\\s+:\\s+(\\S.+)");
}
+ return product;
+}
QString UDevDevice::icon() const
{
@@ -181,6 +192,11 @@
return m_device.sysfsPath();
}
+int UDevDevice::deviceNumber() const
+{
+ return m_device.sysfsNumber();
+}
+
QString UDevDevice::devicePath() const
{
return QString(UDEV_UDI_PREFIX) + deviceName();
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevdevice.h #1201078:1201079
@@ -68,6 +68,7 @@
QString systemAttribute(const char *attribute) const;
QString deviceName() const;
QString devicePath() const;
+ int deviceNumber() const;
private:
UdevQt::Device m_device;
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevmanager.cpp #1201078:1201079
@@ -25,6 +25,7 @@
#include "../shared/rootdevice.h"
#include <QtCore/QSet>
+#include <QtCore/QFile>
using namespace Solid::Backends::UDev;
using namespace Solid::Backends::Shared;
@@ -53,9 +54,14 @@
bool UDevManager::Private::isOfInterest(const UdevQt::Device &device)
{
- return device.driver() == "processor" ||
- device.driver() == "video";
+ if (device.driver() == "processor") {
+ // Linux ACPI reports processor slots, rather than processors.
+ // Empty slots will not have a system device associated with them.
+ return QFile::exists(device.sysfsPath() + "/sysdev");
+ } else {
+ return device.driver() == "video";
}
+}
UDevManager::UDevManager(QObject *parent)
: Solid::Ifaces::DeviceManager(parent),
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevprocessor.cpp #1201078:1201079
@@ -21,6 +21,7 @@
#include "udevprocessor.h"
#include "udevdevice.h"
+#include "cpuinfo.h"
#include "../shared/cpufeatures.h"
#include <QtCore/QFile>
@@ -28,7 +29,9 @@
using namespace Solid::Backends::UDev;
Processor::Processor(UDevDevice *device)
- : DeviceInterface(device)
+ : DeviceInterface(device),
+ m_canChangeFrequency(NotChecked),
+ m_maxSpeed(-1)
{
}
@@ -40,32 +43,50 @@
int Processor::number() const
{
- QRegExp regExp(":(\\d+)$");
- if (regExp.indexIn(m_device->udi()) != -1) {
- return regExp.cap(1).toInt();
+ // There's a subtle assumption here: suppose the system's ACPI
+ // supports more processors/cores than are installed, and so udev reports
+ // 4 cores when there are 2, say. Will the processor numbers (in
+ // /proc/cpuinfo, in particular) always match the sysfs device numbers?
+ return m_device->deviceNumber();
}
- return -1;
-}
int Processor::maxSpeed() const
{
- QFile m_cpuInfo("/proc/cpuinfo");
- m_cpuInfo.open(QIODevice::ReadOnly);
- QString cpuInfo = m_cpuInfo.readAll();
- m_cpuInfo.close();
+ if (m_maxSpeed == -1) {
+ QFile cpuMaxFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_max_freq");
+ if (cpuMaxFreqFile.open(QIODevice::ReadOnly)) {
+ QString value = cpuMaxFreqFile.readAll().trimmed();
+ // cpuinfo_max_freq is in kHz
+ m_maxSpeed = static_cast<int>(value.toLongLong() / 1000);
+ }
+ if (m_maxSpeed <= 0) {
+ // couldn't get the info from /sys, try /proc instead
+ m_maxSpeed = extractCpuInfoLine(number(), "cpu MHz\\s+:\\s+(\\d+).*").toInt();
+ }
+ }
+ return m_maxSpeed;
+}
- const QRegExp regExp("cpu MHz\\s+:\\s+(\\d+)");
- regExp.indexIn(cpuInfo);
+bool Processor::canChangeFrequency() const
+{
+ if (m_canChangeFrequency == NotChecked) {
+ /* Note that cpufreq is the right information source here, rather than
+ * anything to do with throttling (ACPI T-states). */
- // TODO: really get information for each processor.
+ m_canChangeFrequency = CannotChangeFreq;
- return regExp.capturedTexts()[1].toInt();
+ QFile cpuMinFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_min_freq");
+ QFile cpuMaxFreqFile(m_device->deviceName() + "/sysdev/cpufreq/cpuinfo_max_freq");
+ if (cpuMinFreqFile.open(QIODevice::ReadOnly) && cpuMaxFreqFile.open(QIODevice::ReadOnly)) {
+ QString minFreq = cpuMinFreqFile.readAll().trimmed();
+ QString maxFreq = cpuMaxFreqFile.readAll().trimmed();
+ if (minFreq > 0 && maxFreq > minFreq) {
+ m_canChangeFrequency = CanChangeFreq;
}
+ }
+ }
-bool Processor::canChangeFrequency() const
-{
- // TODO: source ?
- return false;
+ return m_canChangeFrequency == CanChangeFreq;
}
Solid::Processor::InstructionSets Processor::instructionSets() const
--- trunk/KDE/kdelibs/solid/solid/backends/udev/udevprocessor.h #1201078:1201079
@@ -45,7 +45,16 @@
virtual int maxSpeed() const;
virtual bool canChangeFrequency() const;
virtual Solid::Processor::InstructionSets instructionSets() const;
+
+private:
+ enum CanChangeFrequencyEnum {
+ NotChecked,
+ CanChangeFreq,
+ CannotChangeFreq
};
+ mutable CanChangeFrequencyEnum m_canChangeFrequency;
+ mutable int m_maxSpeed;
+};
}
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic