76 lines
1.9 KiB
Diff
76 lines
1.9 KiB
Diff
From c72720c41bb2577b1b9db9e12b299869708491c7 Mon Sep 17 00:00:00 2001
|
|
From: Bostjan Skufca <bostjan@a2o.si>
|
|
Date: Fri, 3 Feb 2012 03:10:08 +0100
|
|
Subject: [PATCH] Changes in irq plugin:
|
|
- fixes errors described here: http://mailman.verplant.org/pipermail/collectd/2011-July/004638.html
|
|
- refactored parsing code in order to make it a bit more intuitive
|
|
- added a few additional comments
|
|
|
|
---
|
|
src/irq.c | 24 +++++++++++++++++++++---
|
|
1 files changed, 21 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/irq.c b/src/irq.c
|
|
index 96bf7f0..f3d5730 100644
|
|
--- a/src/irq.c
|
|
+++ b/src/irq.c
|
|
@@ -94,6 +94,8 @@ static int irq_read (void)
|
|
{
|
|
FILE *fh;
|
|
char buffer[1024];
|
|
+ int cpu_count;
|
|
+ char *fields[64];
|
|
|
|
fh = fopen ("/proc/interrupts", "r");
|
|
if (fh == NULL)
|
|
@@ -104,20 +106,36 @@ static int irq_read (void)
|
|
return (-1);
|
|
}
|
|
|
|
+ /* Get CPU count from the first line */
|
|
+ if(fgets (buffer, sizeof (buffer), fh) != NULL) {
|
|
+ cpu_count = strsplit (buffer, fields, 64);
|
|
+ } else {
|
|
+ ERROR ("irq plugin: unable to get CPU count from first line of /proc/interrupts");
|
|
+ return (-1);
|
|
+ }
|
|
+
|
|
while (fgets (buffer, sizeof (buffer), fh) != NULL)
|
|
{
|
|
char *irq_name;
|
|
size_t irq_name_len;
|
|
derive_t irq_value;
|
|
int i;
|
|
-
|
|
- char *fields[64];
|
|
int fields_num;
|
|
+ int irq_values_to_parse;
|
|
|
|
fields_num = strsplit (buffer, fields, 64);
|
|
if (fields_num < 2)
|
|
continue;
|
|
|
|
+ /* Parse this many numeric fields, skip the rest
|
|
+ * (+1 because first there is a name of irq in each line) */
|
|
+ if (fields_num >= cpu_count+1) {
|
|
+ irq_values_to_parse = cpu_count;
|
|
+ } else {
|
|
+ irq_values_to_parse = fields_num - 1;
|
|
+ }
|
|
+
|
|
+ /* First field is irq name */
|
|
irq_name = fields[0];
|
|
irq_name_len = strlen (irq_name);
|
|
if (irq_name_len < 2)
|
|
@@ -132,7 +150,7 @@ static int irq_read (void)
|
|
irq_name_len--;
|
|
|
|
irq_value = 0;
|
|
- for (i = 1; i < fields_num; i++)
|
|
+ for (i = 1; i <= irq_values_to_parse; i++)
|
|
{
|
|
/* Per-CPU value */
|
|
value_t v;
|
|
--
|
|
1.7.3.4
|
|
|