File indexing completed on 2024-05-12 17:00:15

0001 
0002 /*
0003     SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "linuxbackend.h"
0009 
0010 #include <systemstats/SensorObject.h>
0011 #include <systemstats/SensorProperty.h>
0012 
0013 #include <QFile>
0014 
0015 LinuxMemoryBackend::LinuxMemoryBackend(KSysGuard::SensorContainer *container)
0016     : MemoryBackend(container)
0017 {
0018 }
0019 
0020 void LinuxMemoryBackend::update()
0021 {
0022     if (!m_physicalObject->isSubscribed() && !m_swapObject->isSubscribed()) {
0023         return;
0024     }
0025 
0026     QFile meminfo(QStringLiteral("/proc/meminfo"));
0027     meminfo.open(QIODevice::ReadOnly);
0028     // The format of the file is as follows:
0029     // Fieldname:[whitespace]value kB
0030     // A description of the fields can be found at 
0031     // https://www.kernel.org/doc/html/latest/filesystems/proc.html#meminfo
0032     unsigned long long total, free, available, buffer, cache, slab, swapTotal, swapFree;
0033     for (QByteArray line = meminfo.readLine(); !line.isEmpty(); line = meminfo.readLine()) {
0034         int colonIndex = line.indexOf(':');
0035         const auto fields = line.simplified().split(' ');
0036 
0037         const QByteArray name = line.left(colonIndex);
0038         const unsigned long long value = std::strtoull(line.mid(colonIndex + 1), nullptr, 10) * 1024;
0039         if (name == "MemTotal") {
0040             total = value;
0041         } else if (name == "MemFree") {
0042             free = value;
0043         } else if (name == "MemAvailable") {
0044             available = value;
0045         } else if (name == "Buffers") {
0046             buffer = value;
0047         } else if (name == "Cached") {
0048             cache = value;
0049         } else if (name == "Slab") {
0050             slab = value;
0051         } else if (name == "SwapTotal") {
0052             swapTotal = value;
0053         } else if (name == "SwapFree") {
0054             swapFree = value;
0055         }
0056     }
0057     m_total->setValue(total);
0058     m_used->setValue(total - available);
0059     m_free->setValue(available);
0060     m_application->setValue(total - free - cache - buffer - slab);
0061     m_cache->setValue(cache + slab);
0062     m_buffer->setValue(buffer);
0063     m_swapTotal->setValue(swapTotal);
0064     m_swapUsed->setValue(swapTotal - swapFree);
0065     m_swapFree->setValue(swapFree);
0066 }
0067