• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeutils API Reference
  • KDE Home
  • Contact Us
 

superkaramba

  • sources
  • kde-4.12
  • kdeutils
  • superkaramba
  • src
  • sensors
mem.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2003 by Hans Karlsson *
3  * karlsson.h@home.se *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  ***************************************************************************/
10 
11 #include "mem.h"
12 
13 #include <QFile>
14 #include <QTextStream>
15 
16 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
17 #include <sys/time.h>
18 #include <sys/param.h>
19 #include <sys/sysctl.h>
20 #include <sys/resource.h>
21 #include <unistd.h>
22 #include <kvm.h>
23 #include <sys/file.h>
24 #include <osreldate.h>
25 #endif
26 
27 #if defined(Q_OS_NETBSD)
28 #include <sys/param.h>
29 #include <sys/sysctl.h>
30 #include <sys/sched.h>
31 #include <sys/swap.h>
32 #endif
33 
34 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) || defined(__DragonFly__)
35 /* define pagetok in terms of pageshift */
36 #define pagetok(size) ((size) << pageshift)
37 #endif
38 
39 MemSensor::MemSensor(int msec) : Sensor(msec)
40 {
41 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) || defined(__DragonFly__)
42  /* get the page size with "getpagesize" and calculate pageshift from it */
43  int pagesize = getpagesize();
44  pageshift = 0;
45  while (pagesize > 1) {
46  pageshift++;
47  pagesize >>= 1;
48  }
49 
50  /* we only need the amount of log(2)1024 for our conversion */
51  pageshift -= 10;
52 # if (defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018) && !defined(__DragonFly__)
53  connect(&ksp, SIGNAL(receivedStdout(K3Process*,char*,int)),
54  this, SLOT(receivedStdout(K3Process*,char*,int)));
55  connect(&ksp, SIGNAL(processExited(K3Process*)),
56  this, SLOT(processExited(K3Process*)));
57 
58  swapTotal = swapUsed = 0;
59 
60  MaxSet = false;
61 
62  readValues();
63 # elif defined Q_OS_FREEBSD || defined(__DragonFly__)
64  kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, "kvm_open");
65 # endif
66 #else
67  readValues();
68 #endif
69 }
70 
71 MemSensor::~MemSensor()
72 {}
73 
74 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
75 void MemSensor::receivedStdout(K3Process *, char *buffer, int len)
76 {
77  buffer[len] = 0;
78  sensorResult += QString(buffer);
79 }
80 #else
81 void MemSensor::receivedStdout(K3Process *, char *, int)
82 {}
83 #endif
84 
85 void MemSensor::processExited(K3Process *)
86 {
87 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
88  QStringList stringList = sensorResult.split('\n');
89  sensorResult.clear();
90  QStringList itemsList = stringList[1].split(' ');
91 
92  swapUsed = itemsList[2].toInt();
93  swapTotal = itemsList[1].toInt();
94 #endif
95 }
96 
97 int MemSensor::getMemTotal()
98 {
99 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) || defined(__DragonFly__)
100  static int mem = 0;
101  size_t size = sizeof(mem);
102 
103  sysctlbyname("hw.physmem", &mem, &size, NULL, 0);
104  return (mem / 1024);
105 #else
106  QRegExp rx("MemTotal:\\s*(\\d+)");
107  rx.indexIn(meminfo);
108  return (rx.cap(1).toInt());
109 #endif
110 }
111 
112 int MemSensor::getMemFree()
113 {
114 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
115  static int mem = 0;
116  size_t size = sizeof(mem);
117 
118  sysctlbyname("vm.stats.vm.v_free_count", &mem, &size, NULL, 0);
119  return (pagetok(mem));
120 #elif defined(Q_OS_NETBSD)
121  struct uvmexp_sysctl uvmexp;
122  int mib[2];
123  size_t ssize;
124  mib[0] = CTL_VM;
125  mib[1] = VM_UVMEXP2;
126  ssize = sizeof(uvmexp);
127  sysctl(mib, 2, &uvmexp, &ssize, NULL, 0);
128  return pagetok(uvmexp.free);
129 #else
130  QRegExp rx("MemFree:\\s*(\\d+)");
131  rx.indexIn(meminfo);
132  return (rx.cap(1).toInt());
133 #endif
134 }
135 
136 int MemSensor::getBuffers()
137 {
138 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
139  static int mem = 0;
140  size_t size = sizeof(mem);
141 
142  sysctlbyname("vfs.bufspace", &mem, &size, NULL, 0);
143  return (mem / 1024);
144 #elif defined(Q_OS_NETBSD)
145  static int buf_mem = 0;
146  size_t size = sizeof(buf_mem);
147 
148  sysctlbyname("vm.bufmem", &buf_mem, &size, NULL, 0);
149  return (buf_mem / 1024);
150 #else
151  QRegExp rx("Buffers:\\s*(\\d+)");
152  rx.indexIn(meminfo);
153  return (rx.cap(1).toInt());
154 #endif
155 }
156 
157 int MemSensor::getCached()
158 {
159 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
160  static int mem = 0;
161  size_t size = sizeof(mem);
162 
163  sysctlbyname("vm.stats.vm.v_cache_count", &mem, &size, NULL, 0);
164  return (pagetok(mem));
165 #elif defined(Q_OS_NETBSD)
166  return 0;
167 #else
168  QRegExp rx1("Cached:\\s*(\\d+)");
169  QRegExp rx2("SwapCached:\\s*(\\d+)");
170  rx1.indexIn(meminfo);
171  rx2.indexIn(meminfo);
172  return (rx1.cap(1).toInt() + rx2.cap(1).toInt());
173 #endif
174 }
175 
176 
177 int MemSensor::getSwapTotal()
178 {
179 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
180 # if defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018
181  return(swapTotal);
182 # else
183  int n = -1;
184  int pagesize = getpagesize();
185  int retavail = 0;
186 
187  if (kd != NULL)
188  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
189 
190  if (n < 0 || swapinfo.ksw_total == 0)
191  return(0);
192 
193  retavail = swapinfo.ksw_total * pagesize / 1024;
194 
195  return(retavail);
196 # endif
197 #elif defined(Q_OS_NETBSD)
198  struct uvmexp_sysctl uvmexp;
199  int STotal = 0;
200  int pagesize = 1;
201  int mib[2];
202  size_t ssize;
203  mib[0] = CTL_VM;
204  mib[1] = VM_UVMEXP;
205  ssize = sizeof(uvmexp);
206 
207  if (sysctl(mib, 2, &uvmexp, &ssize, NULL, 0) != -1) {
208  pagesize = uvmexp.pagesize;
209  STotal = (pagesize * uvmexp.swpages) >> 10;
210  }
211  return STotal;
212 #else
213  QRegExp rx("SwapTotal:\\s*(\\d+)");
214  rx.indexIn(meminfo);
215  return (rx.cap(1).toInt());
216 #endif
217 }
218 
219 int MemSensor::getSwapFree()
220 {
221 #if defined(Q_OS_FREEBSD) || defined(__DragonFly__)
222 # if defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018
223  return(swapTotal - swapUsed);
224 # else
225  int n = -1;
226  int pagesize = getpagesize();
227  int retfree = 0;
228 
229  if (kd != NULL)
230  n = kvm_getswapinfo(kd, &swapinfo, 1, 0);
231  if (n < 0 || swapinfo.ksw_total == 0)
232  return(0);
233 
234  retfree = (swapinfo.ksw_total - swapinfo.ksw_used) * pagesize / 1024;
235 
236  return(retfree);
237 # endif
238 #elif defined(Q_OS_NETBSD)
239  struct uvmexp_sysctl uvmexp;
240  int STotal = 0;
241  int SFree = 0;
242  int SUsed = 0;
243  int pagesize = 1;
244  int mib[2];
245  size_t ssize;
246  mib[0] = CTL_VM;
247  mib[1] = VM_UVMEXP;
248  ssize = sizeof(uvmexp);
249 
250  if (sysctl(mib, 2, &uvmexp, &ssize, NULL, 0) != -1) {
251  pagesize = uvmexp.pagesize;
252  STotal = (pagesize * uvmexp.swpages) >> 10;
253  SUsed = (pagesize * uvmexp.swpginuse) >> 10;
254  SFree = STotal - SUsed;
255  }
256  return SFree;
257 #else
258  QRegExp rx("SwapFree:\\s*(\\d+)");
259  rx.indexIn(meminfo);
260  return (rx.cap(1).toInt());
261 #endif
262 }
263 
264 void MemSensor::readValues()
265 {
266 #if defined Q_OS_FREEBSD || defined(Q_OS_NETBSD) || defined(__DragonFly__)
267 # if (defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018) && !defined(__DragonFly__)
268  ksp.clearArguments();
269  ksp << "swapinfo";
270  ksp.start(K3Process::NotifyOnExit, K3ProcIO::Stdout);
271 # endif
272 #else
273  QFile file("/proc/meminfo");
274  QString line;
275  if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
276  QTextStream t(&file); // use a text stream
277  meminfo = t.readAll();
278  file.close();
279  }
280 #endif
281 }
282 
283 void MemSensor::update()
284 {
285  readValues();
286  QString format;
287  SensorParams *sp;
288  Meter *meter;
289 #if (defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018)
290  bool set = false;
291 #endif
292  int totalMem = getMemTotal();
293  int usedMem = totalMem - getMemFree();
294  int usedMemNoBuffers = usedMem - getBuffers() - getCached();
295  int totalSwap = getSwapTotal();
296  int usedSwap = totalSwap - getSwapFree();
297 
298  QObject *it;
299  foreach(it, *objList) {
300  sp = qobject_cast<SensorParams*>(it);
301 #if (defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018) && !defined(__DragonFly__)
302  if ((!MaxSet) && (totalSwap > 0)) {
303  setMaxValue(sp);
304  bool set = true;
305  }
306 #endif
307  meter = sp->getMeter();
308  format = sp->getParam("FORMAT");
309  if (format.length() == 0) {
310  format = "%um";
311  }
312 
313  format.replace(QRegExp("%fmb", Qt::CaseInsensitive),
314  QString::number((int)((totalMem - usedMemNoBuffers) / 1024.0 + 0.5)));
315  format.replace(QRegExp("%fm", Qt::CaseInsensitive),
316  QString::number((int)((totalMem - usedMem) / 1024.0 + 0.5)));
317 
318  format.replace(QRegExp("%umb", Qt::CaseInsensitive),
319  QString::number((int)((usedMemNoBuffers) / 1024.0 + 0.5)));
320  format.replace(QRegExp("%um", Qt::CaseInsensitive),
321  QString::number((int)((usedMem) / 1024.0 + 0.5)));
322 
323  format.replace(QRegExp("%tm", Qt::CaseInsensitive),
324  QString::number((int)((totalMem) / 1024.0 + 0.5)));
325 
326  format.replace(QRegExp("%fs", Qt::CaseInsensitive),
327  QString::number((int)((totalSwap - usedSwap) / 1024.0 + 0.5)));
328  format.replace(QRegExp("%us", Qt::CaseInsensitive),
329  QString::number((int)(usedSwap / 1024.0 + 0.5)));
330  format.replace(QRegExp("%ts", Qt::CaseInsensitive),
331  QString::number((int)(totalSwap / 1024.0 + 0.5)));
332 
333  meter->setValue(format);
334  }
335 #if (defined(Q_OS_FREEBSD) && __FreeBSD_version < 500018) && !defined(__DragonFly__)
336  if (set)
337  MaxSet = true;
338 #endif
339 }
340 
341 void MemSensor::setMaxValue(SensorParams *sp)
342 {
343  Meter *meter;
344  meter = sp->getMeter();
345  QString f;
346  f = sp->getParam("FORMAT");
347 
348  if (f.length() == 0) {
349  f = "%um";
350  }
351  if (f == "%fm" || f == "%um" || f == "%fmb" || f == "%umb")
352  meter->setMax(getMemTotal() / 1024);
353  if (f == "%fs" || f == "%us")
354  meter->setMax(getSwapTotal() / 1024);
355 }
356 
357 #include "mem.moc"
mem.h
MemSensor::~MemSensor
~MemSensor()
Definition: mem.cpp:71
MemSensor::getMemFree
int getMemFree()
Definition: mem.cpp:112
SensorParams::getMeter
Meter * getMeter() const
Definition: sensorparams.cpp:31
MemSensor::getCached
int getCached()
Definition: mem.cpp:157
QObject
Sensor
Definition: sensor.h:17
MemSensor::getMemTotal
int getMemTotal()
Definition: mem.cpp:97
MemSensor::getSwapFree
int getSwapFree()
Definition: mem.cpp:219
SensorParams
Hans Karlsson.
Definition: sensorparams.h:30
MemSensor::getBuffers
int getBuffers()
Definition: mem.cpp:136
SensorParams::getParam
QString getParam(const QString &) const
Definition: sensorparams.cpp:26
MemSensor::setMaxValue
void setMaxValue(SensorParams *sp)
Definition: mem.cpp:341
MemSensor::update
void update()
Definition: mem.cpp:283
Meter::setMax
virtual void setMax(int max)
Definition: meters/meter.cpp:126
MemSensor::getSwapTotal
int getSwapTotal()
Definition: mem.cpp:177
MemSensor::MemSensor
MemSensor(int interval)
Definition: mem.cpp:39
Meter
Definition: meters/meter.h:23
Meter::setValue
virtual void setValue(int)
Definition: meters/meter.cpp:136
Sensor::objList
QList< QObject * > * objList
Definition: sensor.h:39
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:07:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

superkaramba

Skip menu "superkaramba"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • kremotecontrol
  • ktimer
  • kwallet
  • superkaramba
  • sweeper

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal