Skip to content

Commit 1794e09

Browse files
committed
String optimizations
1 parent 73721fb commit 1794e09

File tree

2 files changed

+61
-33
lines changed

2 files changed

+61
-33
lines changed

mainwindow.cpp

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,10 @@ MainWindow::MainWindow(QWidget *parent)
8989
});
9090
connect(ui->listServices, &QListWidget::itemEntered, this, [this](QListWidgetItem *item) {
9191
if (auto service = item->data(Qt::UserRole).value<Service *>()) {
92-
ui->listServices->blockSignals(true);
9392
if (item->toolTip().isEmpty()) {
94-
ui->lineSearch->blockSignals(true);
95-
item->setToolTip(service->getDescription());
96-
ui->lineSearch->blockSignals(false);
93+
const QString description = service->getDescription();
94+
item->setToolTip(description);
9795
}
98-
ui->listServices->blockSignals(false);
9996
}
10097
});
10198
}
@@ -199,16 +196,25 @@ void MainWindow::processNonSystemdServices()
199196
const auto list = cmd.getOut("/sbin/service --status-all", true).trimmed().split("\n");
200197
QRegularExpression re("dpkg-.*$");
201198
services.reserve(list.size());
199+
200+
const QLatin1String sectionDelimiter("] ");
201+
const QLatin1String debian("debian");
202+
const QLatin1String runningPrefix("[ + ]");
203+
202204
for (const auto &item : list) {
203-
if (item.trimmed().contains(re) || item.section("] ", 1) == "debian") {
205+
const QString trimmedItem = item.trimmed();
206+
if (trimmedItem.contains(re) || item.section(sectionDelimiter, 1) == debian) {
204207
continue;
205208
}
206-
QString name = item.section("] ", 1);
209+
210+
const QString name = item.section(sectionDelimiter, 1);
207211
if (name.isEmpty()) {
208212
continue;
209213
}
210-
services.append(QSharedPointer<Service>::create(name, item.trimmed().startsWith("[ + ]")));
211-
services.last()->setEnabled(Service::isEnabled(name) || dependTargets.contains(name));
214+
215+
auto service = QSharedPointer<Service>::create(name, trimmedItem.startsWith(runningPrefix));
216+
service->setEnabled(dependTargets.contains(name) || Service::isEnabled(name));
217+
services.append(std::move(service));
212218
}
213219
}
214220

@@ -230,29 +236,39 @@ void MainWindow::processSystemdActiveInactiveServices(QStringList &names)
230236
}
231237

232238
auto jsonArray = doc.array();
233-
names.reserve(jsonArray.size() * 2);
234239

235240
QSet<QString> nameSet(names.begin(), names.end());
236241
services.reserve(services.size() + jsonArray.size());
242+
nameSet.reserve(nameSet.size() + jsonArray.size());
243+
244+
const QLatin1String unitKey("unit");
245+
const QLatin1String loadKey("load");
246+
const QLatin1String subKey("sub");
247+
const QLatin1String dotSeparator(".");
248+
const QLatin1String notFoundValue("not-found");
249+
const QLatin1String runningValue("running");
237250

238251
for (const auto &value : jsonArray) {
239252
if (!value.isObject()) {
240253
continue;
241254
}
242-
auto obj = value.toObject();
243-
QString name = obj.value("unit").toString().section('.', 0, 0);
244255

245-
if (name.isEmpty() || nameSet.contains(name) || obj.value("load").toString() == "not-found") {
256+
const auto obj = value.toObject();
257+
const QString name = obj.value(unitKey).toString().section(dotSeparator, 0, 0);
258+
259+
if (name.isEmpty() || nameSet.contains(name)
260+
|| obj.value(loadKey).toString() == notFoundValue) {
246261
continue;
247262
}
248263

249264
nameSet.insert(name);
250265

251-
bool isRunning = (obj.value("sub").toString() == "running");
252-
bool isEnabled = Service::isEnabled(name) || dependTargets.contains(name);
266+
const bool isRunning = (obj.value(subKey).toString() == runningValue);
267+
const bool isEnabled = dependTargets.contains(name) || Service::isEnabled(name);
253268

254-
services.append(QSharedPointer<Service>::create(name, isRunning));
255-
services.last()->setEnabled(isEnabled);
269+
auto service = QSharedPointer<Service>::create(name, isRunning);
270+
service->setEnabled(isEnabled);
271+
services.append(std::move(service));
256272
}
257273
names = QStringList(nameSet.begin(), nameSet.end());
258274
}
@@ -270,19 +286,23 @@ void MainWindow::processSystemdMaskedServices(QStringList &names)
270286
auto jsonArray = doc.array();
271287
QSet<QString> nameSet(names.begin(), names.end());
272288
services.reserve(services.size() + jsonArray.size());
289+
nameSet.reserve(nameSet.size() + jsonArray.size());
290+
291+
const QLatin1String unitFileKey("unit_file");
292+
const QLatin1String dotSeparator(".");
273293

274294
for (const auto &value : jsonArray) {
275295
if (!value.isObject()) {
276296
continue;
277297
}
278-
auto obj = value.toObject();
279-
QString name = obj.value("unit_file").toString().section('.', 0, 0);
298+
const auto obj = value.toObject();
299+
const QString name = obj.value(unitFileKey).toString().section(dotSeparator, 0, 0);
280300

281301
if (name.isEmpty() || nameSet.contains(name)) {
282302
continue;
283303
}
284-
285304
nameSet.insert(name);
305+
286306
auto service = QSharedPointer<Service>::create(name, false);
287307
service->setEnabled(false);
288308
services.append(std::move(service));

service.cpp

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ QString Service::getInfo() const
5858

5959
bool Service::isEnabled(const QString &name)
6060
{
61-
if (initSystem == "systemd") {
62-
return (QProcess::execute("systemctl", {"-q", "is-enabled", name}) == 0);
61+
if (initSystem == QLatin1String("systemd")) {
62+
return QProcess::execute(QLatin1String("systemctl"),
63+
{QLatin1String("-q"), QLatin1String("is-enabled"), name + QLatin1String(".service")})
64+
== 0;
6365
} else {
64-
return (
65-
QProcess::execute("/bin/bash", {"-c", QString("[[ -e /etc/rc5.d/S*%1 || -e /etc/rcS.d/S*%1 ]]").arg(name)})
66-
== 0);
66+
// Check both runlevel 5 (multi-user with GUI) and runlevel S (single-user/boot)
67+
QString command = QString(QLatin1String("[[ -e /etc/rc5.d/S*%1 || -e /etc/rcS.d/S*%1 ]]")).arg(name);
68+
return QProcess::execute(QLatin1String("/bin/bash"), {QLatin1String("-c"), command}) == 0;
6769
}
6870
}
6971

@@ -160,7 +162,7 @@ void Service::setRunning(bool running)
160162
QString Service::getInfoFromFile(const QString &name)
161163
{
162164
// Check for the service file in standard locations
163-
QStringList possiblePaths = {"/etc/init.d/" + name, "/etc/init.d/" + name + ".sh"};
165+
const QStringList possiblePaths = {"/etc/init.d/" + name, "/etc/init.d/" + name + ".sh"};
164166

165167
QString filePath;
166168
for (const auto &path : possiblePaths) {
@@ -176,26 +178,32 @@ QString Service::getInfoFromFile(const QString &name)
176178
}
177179

178180
QFile file(filePath);
179-
if (!file.open(QIODevice::ReadOnly)) {
181+
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
180182
qDebug() << "Could not open file" << filePath;
181183
return Cmd().getOut("/sbin/service " + name + " status", false, false, true);
182184
}
183185

184186
QString info;
187+
info.reserve(1024); // Pre-allocate memory to avoid reallocations
185188
bool info_header = false;
186189

187-
while (!file.atEnd()) {
188-
QString line = file.readLine().trimmed();
190+
QTextStream in(&file);
191+
while (!in.atEnd()) {
192+
QString line = in.readLine().trimmed();
193+
194+
if (line.startsWith("### BEGIN INIT INFO")) {
195+
info_header = true;
196+
continue;
197+
}
198+
189199
if (line.startsWith("### END INIT INFO")) {
190-
info_header = false;
200+
break; // No need to read the rest of the file
191201
}
202+
192203
if (info_header) {
193204
line.remove(0, 2);
194205
info.append(line + '\n');
195206
}
196-
if (line.startsWith("### BEGIN INIT INFO")) {
197-
info_header = true;
198-
}
199207
}
200208

201209
return info;

0 commit comments

Comments
 (0)