--- a/src/lib/io/kprocess.cpp +++ b/src/lib/io/kprocess.cpp @@ -20,6 +20,11 @@ #include +#include +#include +#include +#include + ///////////////////////////// // public member functions // ///////////////////////////// @@ -243,6 +248,50 @@ void KProcess::start() { Q_D(KProcess); + QSettings settings(QStringLiteral("kreslimit")); + QStringList sysd_arguments; + QString progname = QFileInfo(QProcess::program()).baseName(); + sysd_arguments << QStringLiteral("--user"); + sysd_arguments << QStringLiteral("--slice=kreslimit-%1").arg(progname); + sysd_arguments << QStringLiteral("--unit=%1-%2").arg(progname).arg(QRandomGenerator::global()->generate()); + sysd_arguments << QStringLiteral("-t"); + sysd_arguments << QStringLiteral("-p"); + + unsigned int all_memsize = settings.value(QStringLiteral("all_memsize"), QVariant(0)).toUInt(); + bool all_enable = settings.value(QStringLiteral("all_enable"), false).toBool(); + + if(all_enable) { + sysd_arguments << QStringLiteral("MemoryHigh=%1M").arg(all_memsize); + sysd_arguments << QProcess::program(); + sysd_arguments << QProcess::arguments(); + QProcess::start(QStringLiteral("/bin/systemd-run"), sysd_arguments); + return; + } + + QString apps = settings.value(QStringLiteral("applist"), QString()).toString(); + if(apps.isEmpty() || apps.isNull()) { + QProcess::start(d->openMode); + return; + } + + QStringList applist = apps.split(QChar::fromLatin1(',')); + for (auto constIterator = applist.constBegin(); constIterator != applist.constEnd(); ++constIterator) { + const QString &rec = *constIterator; + if(rec.startsWith(QProcess::program())) { + QStringList res = rec.split(QChar::fromLatin1(';')); + if(res.size() != 2) { + continue; + } + if(QProcess::program() == res[0]) { + sysd_arguments << QStringLiteral("MemoryHigh=%1M").arg(res[1].toUInt()); + sysd_arguments << QProcess::program(); + sysd_arguments << QProcess::arguments(); + QProcess::start(QStringLiteral("/bin/systemd-run"), sysd_arguments); + return; + } + } + } + QProcess::start(d->openMode); }