1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
/*
* HardInfo - Displays System Information
* Copyright (C) 2003-2007 L. A. F. Pereira <l@tia.mat.br>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2 or later.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
#include "devices.h"
GHashTable *memlabels = NULL;
gint comparMem (gpointer a, gpointer b) {return strcmp( (char*)a, (char*)b );}
void scan_memory_do(void)
{
gchar **keys, *tmp, *memstr, *lgstr, *tmp_label, *trans_val;
static gint offset = -1;
gint i;
GList *list=NULL, *a;
if (offset == -1) {
/* gah. linux 2.4 adds three lines of data we don't need in
* /proc/meminfo.
* The lines look something like this:
* total: used: free: shared: buffers: cached:
* Mem: 3301101568 1523159040 1777942528 0 3514368 1450356736
* Swap: 0 0 0
*/
gchar *os_kernel = module_call_method("computer::getOSKernel");
if (os_kernel) {
offset = strstr(os_kernel, "Linux 2.4") ? 3 : 0;
g_free(os_kernel);
} else {
offset = 0;
}
}
g_file_get_contents("/proc/meminfo", &tmp, NULL, NULL);
keys = g_strsplit(tmp, "\n", 0);
g_free(tmp);
for (i = offset; keys[i]; i++) {
gchar **newkeys = g_strsplit(keys[i], ":", 0);
if (!newkeys[0]) {
g_strfreev(newkeys);
break;
}
g_strstrip(newkeys[0]);
g_strstrip(newkeys[1]);
/* try to find a localizable label */
tmp = g_hash_table_lookup(memlabels, newkeys[0]);
if (tmp)
tmp_label = _(tmp);
else
tmp_label = newkeys[0];
if (strstr(newkeys[1], "kB")) {
trans_val = g_strdup_printf("%d %s", atoi(newkeys[1]), _("KiB") );
} else {
trans_val = strdup(newkeys[1]);
}
/*add MemTotal for internal usage*/
//if(strcmp(newkeys[0],"MemTotal")==0) moreinfo_add_with_prefix("DEV", newkeys[0], g_strdup(newkeys[1]));
list = g_list_prepend(list, g_strdup_printf("%s=%s=%s\n", newkeys[0], trans_val, tmp_label));
g_free(trans_val);
g_strfreev(newkeys);
}
g_strfreev(keys);
//Sort memory information
list=g_list_sort(list,(GCompareFunc)comparMem);
//add memory information
memstr=strdup("");lgstr=strdup("");
while(list){
char **datas = g_strsplit(list->data,"=",3);
if (!datas[0]) {
g_strfreev(datas);
break;
}
moreinfo_add_with_prefix("DEV", datas[0], g_strdup(datas[1]));
tmp = g_strconcat(memstr, datas[0],"=",datas[1],"|",datas[2], "\n", NULL);
g_free(memstr);
memstr=tmp;
tmp = g_strconcat(lgstr,"UpdateInterval$", datas[0], "=1000\n", NULL);
g_free(lgstr);
lgstr = tmp;
g_strfreev(datas);
//next and free
a=list;
list=list->next;
free(a->data);
g_list_free_1(a);
}
tmp=meminfo; meminfo = memstr; g_free(tmp);
tmp=lginterval; lginterval = lgstr; g_free(tmp);
}
void init_memory_labels(void)
{
static const struct {
char *proc_label;
char *real_label;
} proc2real[] = {
/* https://docs.kernel.org/filesystems/proc.html */
{ "MemTotal", N_("Total physical memory usable by the system") },
{ "MemFree", N_("Free memory which is not used for anything") },
{ "SwapTotal", N_("Virtual memory, total swap space available") },
{ "SwapFree", N_("Virtual memory, remaining swap space available") },
{ "SwapCached", N_("Memory present within main memory and in the swapfile") },
{ "HighTotal", N_("HighTotal value can vary based on the type of kernel used") },
{ "HighFree", N_("Amount of memory that is not directly mapped into kernel space") },
{ "LowTotal", N_("LowTotal value can vary based on the type of kernel used") },
{ "LowFree", N_("Total and free memory directly mapped into kernel space") },
{ "MemAvailable", N_("Available memory for allocation to any process, without swapping") },
{ "Buffers", N_("Memory in buffer cache, temporary storage for raw disk blocks") },
{ "Cached", N_("Memory in the page cache (diskcache, shared memory, tmpfs and shmem)") },
{ "Active", N_("Memory used more recently and not swapped out or reclaimed") },
{ "Inactive", N_("Memory not been used recently and can be swapped out or reclaimed") },
{ "Active(anon)", N_("Anonymous memory used more recently and not swapped out") },
{ "Inactive(anon)", N_("Anonymous memory not been used and can be swapped out") },
{ "Active(file)", N_("Pagecache memory been used more recently and not reclaimed") },
{ "Inactive(file)", N_("Pagecache memory reclaimable without huge performance impact") },
{ "Unevictable", N_("Unevictable pages can't be swapped out for a variety of reasons") },
{ "Mlocked", N_("Pages locked to memory using the mlock() system call") },
{ "Zswap", N_("Memory consumed by the zswap backend (compressed size)") },
{ "Zswapped", N_("Amount of anonymous memory stored in zswap (original size)") },
{ "Dirty", N_("Memory waiting to be written back to disk") },
{ "Writeback", N_("Memory which is actively being written back to disk") },
{ "AnonPages", N_("Non-file backed pages mapped into userspace page tables") },
{ "Mapped", N_("Files which have been mmapped, such as libraries") },
{ "Shmem", N_("Total memory used by shared memory (shmem) and tmpfs") },
{ "KReclaimable", N_("Kernel allocations reclaimable under memory pressure") },
{ "Slab", N_("In-kernel data structures cache") },
{ "SReclaimable", N_("Part of Slab, that might be reclaimed, such as caches") },
{ "SUnreclaim", N_("Part of Slab, that cannot be reclaimed on memory pressure") },
{ "KernelStack", N_("Memory consumed by the kernel stacks of all tasks") },
{ "PageTables", N_("Memory consumed by userspace page tables") },
{ "SecPageTables", N_("Memory consumed by secondary page tables") },
{ "NFS_Unstable", N_("Previous counted pages which had been written to the server") },
{ "Bounce", N_("Memory used for block device bounce buffers") },
{ "WritebackTmp", N_("Memory used by FUSE for temporary writeback buffers") },
{ "CommitLimit", N_("Total memory currently available to be allocated on the system") },
{ "Committed_AS", N_("The amount of memory presently allocated on the system") },
{ "VmallocTotal", N_("Total size of vmalloc virtual address space") },
{ "VmallocUsed", N_("Amount of vmalloc area which is used") },
{ "VmallocChunk", N_("Largest contiguous block of vmalloc area which is free") },
{ "Percpu", N_("Memory allocated to the percpu allocator") },
{ "HardwareCorrupted", N_("Amount of memory the kernel identifies as corrupted") },
{ "AnonHugePages", N_("Non-file backed huge pages mapped into userspace page tables") },
{ "ShmemHugePages", N_("Memory used by shmem and tmpfs allocated with huge pages") },
{ "ShmemPmdMapped", N_("Shared memory mapped into userspace with huge pages") },
{ "FileHugePages", N_("Memory used for fs data (page cache) allocated with huge pages") },
{ "FilePmdMapped", N_("Page cache mapped into userspace with huge pages") },
{ "CmaTotal", N_("Memory reserved for the Contiguous Memory Allocator (CMA)") },
{ "CmaFree", N_("Free remaining memory in the CMA reserves") },
{ "Unaccepted", N_("Amount of unaccepted memory usable by the kernel") },
{ "HugePages_Total", N_("Size of the pool of huge pages") },
{ "HugePages_Free", N_("Number of huge pages available") },
{ "HugePages_Rsvd", N_("Number of huge pages reserved") },
{ "HugePages_Surp", N_("Number of huge pages surplus") },
{ "Hugepagesize", N_("Huge page size, used in conjunction with hugepages parameter") },
{ "Hugetlb", N_("Total amount of memory consumed by huge pages of all sizes") },
{ "DirectMap4k", N_("Breakdown of page table sizes of 4k size") },
{ "DirectMap2M", N_("Breakdown of page table sizes of 2M size") },
{ "DirectMap1G", N_("Breakdown of page table sizes of 1G size") },
{ NULL },
};
gint i;
memlabels = g_hash_table_new(g_str_hash, g_str_equal);
for (i = 0; proc2real[i].proc_label; i++) {
g_hash_table_insert(memlabels, proc2real[i].proc_label,
_(proc2real[i].real_label));
}
}
|