summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoît Dejean <bdejean@gmail.com>2017-01-28 09:39:43 +0100
committerBenoît Dejean <bdejean@gmail.com>2017-01-28 09:39:43 +0100
commit1a103bf142856ec129eb124d1dae70ddb3dd02e8 (patch)
treef8f61d343ee10553710071e122ab8caeb9fbd64f
parent3ff313dd0322fe95db812aaf666eb57abc38069f (diff)
downloadlibgtop-1a103bf142856ec129eb124d1dae70ddb3dd02e8.tar.gz
When parsing /proc/cpuinfo, ignore paragraphs that do not describe a CPU/core.
-rw-r--r--sysdeps/linux/sysinfo.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/sysdeps/linux/sysinfo.c b/sysdeps/linux/sysinfo.c
index 99d8fcc5..7dbd5eeb 100644
--- a/sysdeps/linux/sysinfo.c
+++ b/sysdeps/linux/sysinfo.c
@@ -50,13 +50,20 @@ init_sysinfo (glibtop *server)
g_free(buffer);
- for(sysinfo.ncpu = 0;
- sysinfo.ncpu < GLIBTOP_NCPU && processors[sysinfo.ncpu] && *processors[sysinfo.ncpu];
- sysinfo.ncpu++) {
+ sysinfo.ncpu = 0;
+ for (char** this_proc = &processors[0]; *this_proc && **this_proc; this_proc++) {
+
+ if (sysinfo.ncpu >= GLIBTOP_NCPU) {
+ glibtop_warn_r(server, "Cannot deal with more than %d CPUs", GLIBTOP_NCPU);
+ break;
+ }
gchar **parts, **p;
- if (g_strrstr (processors[sysinfo.ncpu], "processor" ) == NULL)
- continue;
+ if (g_strrstr (*this_proc, "processor" ) == NULL) {
+ /* skip unknown paragraph */
+ continue;
+ }
+
glibtop_entry * const cpuinfo = &sysinfo.cpuinfo[sysinfo.ncpu];
cpuinfo->labels = g_ptr_array_new ();
@@ -68,7 +75,7 @@ init_sysinfo (glibtop *server)
g_free, g_free);
/* "<key> : <value>" */
- parts = g_strsplit_set(processors[sysinfo.ncpu], ":\n", 0);
+ parts = g_strsplit_set(*this_proc, ":\n", 0);
for(p = parts; *p && *(p+1); p += 2) {
@@ -89,6 +96,7 @@ init_sysinfo (glibtop *server)
g_free(parts);
+ sysinfo.ncpu++;
}
g_strfreev(processors);