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