Skip to content

Commit eccd126

Browse files
committed
refactor: remove PowerManager dependency from session manager
1. Removed PowerManager D-Bus interface XML definition and generated adaptor files 2. Replaced PowerManager dependency with direct system checks for power operations 3. Added virtual machine detection using systemd-detect-virt 4. Modified CanHibernate() and CanSuspend() to check /sys/power/ mem_sleep directly 5. Removed m_powerInter member variable and related initialization The PowerManager service dependency was unnecessary for basic power state checks. The session manager can directly query system files and detect VM environments to determine available power operations, reducing service dependencies and improving reliability. Influence: 1. Test hibernation functionality on physical machines with hibernation support 2. Test suspend functionality on systems with different sleep states 3. Verify VM detection works correctly in virtualized environments 4. Test power operations are properly disabled in VMs 5. Check /sys/power/mem_sleep file access permissions 6. Verify no regression in shutdown and reboot functionality 重构:从会话管理器中移除 PowerManager 依赖 1. 删除了 PowerManager D-Bus 接口 XML 定义和生成的适配器文件 2. 使用直接的系统检查替换 PowerManager 依赖来获取电源操作状态 3. 添加了使用 systemd-detect-virt 的虚拟机检测功能 4. 修改 CanHibernate() 和 CanSuspend() 直接检查 /sys/power/mem_sleep 文件 5. 移除了 m_powerInter 成员变量和相关初始化 PowerManager 服务依赖对于基本的电源状态检查是不必要的。会话管理器可以直 接查询系统文件和检测 VM 环境来确定可用的电源操作,从而减少服务依赖并提高 可靠性。 Influence: 1. 在支持休眠的物理机器上测试休眠功能 2. 在不同睡眠状态的系统上测试挂起功能 3. 验证虚拟化环境中的 VM 检测功能正常工作 4. 测试 VM 中电源操作是否正确禁用 5. 检查 /sys/power/mem_sleep 文件访问权限 6. 验证关机和重启功能没有回归问题
1 parent f39786d commit eccd126

File tree

6 files changed

+23
-159
lines changed

6 files changed

+23
-159
lines changed

dbus/interface/org.deepin.dde.PowerManager1.xml

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/dde-session/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ qt_add_dbus_adaptor(ADAPTER_SOURCES
3838
)
3939

4040
# dbus interface
41-
qt_add_dbus_interface_fix(INTERFACE_SOURCES org.deepin.dde.PowerManager1.xml PowerManager org_deepin_dde_PowerManager1)
4241
qt_add_dbus_interface_fix(INTERFACE_SOURCES org.deepin.dde.Bluetooth1.xml Bluetooth org_deepin_dde_Bluetooth1)
4342
qt_add_dbus_interface_fix(INTERFACE_SOURCES org.deepin.dde.Daemon1.xml SessionDaemon org_deepin_dde_Daemon1)
4443
qt_add_dbus_interface_fix(INTERFACE_SOURCES org.freedesktop.login1.Manager.xml Login1Manager org_freedesktop_login1_Manager)

src/dde-session/impl/sessionmanager.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include <QDBusObjectPath>
1515
#include <QStandardPaths>
1616
#include <QJsonDocument>
17+
#include <QProcess>
18+
#include <QFile>
1719

1820
#include <unistd.h>
1921
#include <signal.h>
@@ -70,13 +72,13 @@ SessionManager::SessionManager(QObject *parent)
7072
, m_currentUid(QString::number(getuid()))
7173
, m_stage(0)
7274
, m_currentSessionPath("/")
73-
, m_powerInter(new org::deepin::dde::PowerManager1("org.deepin.dde.PowerManager1", "/org/deepin/dde/PowerManager1", QDBusConnection::systemBus(), this))
7475
, m_audioInter(new org::deepin::dde::Audio1("org.deepin.dde.Audio1", "/org/deepin/dde/Audio1", QDBusConnection::sessionBus(), this))
7576
, m_login1ManagerInter(new org::freedesktop::login1::Manager("org.freedesktop.login1", "/org/freedesktop/login1", QDBusConnection::systemBus(), this))
7677
, m_login1UserInter(new org::freedesktop::login1::User("org.freedesktop.login1", m_login1ManagerInter->GetUser(getuid()).value().path(), QDBusConnection::systemBus(), this))
7778
, m_login1SessionInter(new org::freedesktop::login1::Session("org.freedesktop.login1", m_login1UserInter->display().path.path(), QDBusConnection::systemBus(), this))
7879
, m_systemd1ManagerInter(new org::freedesktop::systemd1::Manager("org.freedesktop.systemd1", "/org/freedesktop/systemd1", QDBusConnection::sessionBus(), this))
7980
, m_DBusInter(new org::freedesktop::DBus("org.freedesktop.DBus", "/org/freedesktop/DBus", QDBusConnection::sessionBus(), this))
81+
, m_isVM(detectVirtualMachine())
8082
{
8183
initConnections();
8284

@@ -90,7 +92,6 @@ SessionManager::SessionManager(QObject *parent)
9092
m_soundTheme = appearanceConfig->value("Sound_Theme", "deepin").toString();
9193
}
9294
});
93-
9495
// 播放登录提示音
9596
if (canPlayEvent("desktop-login")) {
9697
playLoginSound();
@@ -246,12 +247,7 @@ bool SessionManager::AllowSessionDaemonRun()
246247

247248
bool SessionManager::CanHibernate()
248249
{
249-
if (QString(getenv("POWER_CAN_SLEEP")) == "0") {
250-
return false;
251-
}
252-
253-
// 是否支持休眠
254-
if (!m_powerInter->CanHibernate()) {
250+
if (QString(getenv("POWER_CAN_SLEEP")) == "0" || m_isVM) {
255251
return false;
256252
}
257253

@@ -279,12 +275,12 @@ bool SessionManager::CanShutdown()
279275

280276
bool SessionManager::CanSuspend()
281277
{
282-
if (QString(getenv("POWER_CAN_SLEEP")) == "0") {
278+
if (QString(getenv("POWER_CAN_SLEEP")) == "0" || m_isVM) {
283279
return false;
284280
}
285281

286-
// 是否支持待机
287-
if (!m_powerInter->CanSuspend()) {
282+
// 检查内存休眠支持文件是否存在
283+
if (!QFile::exists("/sys/power/mem_sleep")) {
288284
return false;
289285
}
290286

@@ -974,3 +970,17 @@ void SessionManager::handleLoginSessionUnlocked()
974970
emitLockChanged(false);
975971
}
976972
}
973+
974+
bool SessionManager::detectVirtualMachine() {
975+
QProcess process;
976+
process.start("/usr/bin/systemd-detect-virt", QStringList());
977+
process.waitForFinished(-1);
978+
979+
if (process.exitCode() != 0) {
980+
qWarning() << "Failed to detect virtual machine, error:" << process.errorString();
981+
return false;
982+
}
983+
984+
QString name = QString::fromUtf8(process.readAllStandardOutput()).trimmed();
985+
return name != "none" && !name.isEmpty();
986+
}

src/dde-session/impl/sessionmanager.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <QDBusInterface>
1111
#include <QDBusContext>
1212

13-
#include "org_deepin_dde_PowerManager1.h"
1413
#include "org_deepin_dde_Audio1.h"
1514

1615
#include "org_freedesktop_login1_Manager.h"
@@ -80,6 +79,7 @@ public Q_SLOTS:
8079
void prepareLogout(bool force);
8180
void prepareShutdown(bool force);
8281
void clearCurrentTty();
82+
bool detectVirtualMachine();
8383

8484
// tiny function
8585
QString getAudioServerBackend();
@@ -133,10 +133,10 @@ private Q_SLOTS:
133133
QString m_currentUid;
134134
QString m_soundTheme;
135135
int m_stage;
136+
bool m_isVM;
136137
QDBusObjectPath m_currentSessionPath;
137138

138139
// dbus client
139-
org::deepin::dde::PowerManager1 *m_powerInter;
140140
org::deepin::dde::Audio1 *m_audioInter;
141141
org::freedesktop::login1::Manager *m_login1ManagerInter;
142142
org::freedesktop::login1::User *m_login1UserInter;

toolGenerate/qdbusxml2cpp/org.deepin.dde.PowerManager1Adaptor.cpp

Lines changed: 0 additions & 67 deletions
This file was deleted.

toolGenerate/qdbusxml2cpp/org.deepin.dde.PowerManager1Adaptor.h

Lines changed: 0 additions & 63 deletions
This file was deleted.

0 commit comments

Comments
 (0)