]> xenbits.xensource.com Git - libvirt.git/commitdiff
Simplify linuxNodeGetCPUStats
authorJán Tomko <jtomko@redhat.com>
Tue, 21 Jan 2014 12:57:30 +0000 (13:57 +0100)
committerJán Tomko <jtomko@redhat.com>
Tue, 28 Jan 2014 07:48:31 +0000 (08:48 +0100)
Split out the repetitive code.

src/nodeinfo.c

index 02c58af2bd5e1c570450a2023191b322b2c8d625..252d9b9784b62dde96ad6eb0e362184db8ae1ffa 100644 (file)
@@ -674,6 +674,20 @@ cleanup:
     return ret;
 }
 
+static int
+virNodeCPUStatsAssign(virNodeCPUStatsPtr param,
+                      const char *name,
+                      unsigned long long value)
+{
+    if (virStrcpyStatic(param->field, name) == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "%s", _("Field kernel cpu time too long for destination"));
+        return -1;
+    }
+    param->value = value;
+    return 0;
+}
+
 # define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
 
 int
@@ -712,8 +726,6 @@ linuxNodeGetCPUStats(FILE *procstat,
         char *buf = line;
 
         if (STRPREFIX(buf, cpu_header)) { /* aka logical CPU time */
-            size_t i;
-
             if (sscanf(buf,
                        "%*s %llu %llu %llu %llu %llu" // user ~ iowait
                        "%llu %llu %llu %llu %llu",    // irq  ~ guest_nice
@@ -722,51 +734,22 @@ linuxNodeGetCPUStats(FILE *procstat,
                 continue;
             }
 
-            for (i = 0; i < *nparams; i++) {
-                virNodeCPUStatsPtr param = &params[i];
-
-                switch (i) {
-                case 0: /* fill kernel cpu time here */
-                    if (virStrcpyStatic(param->field, VIR_NODE_CPU_STATS_KERNEL) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       "%s", _("Field kernel cpu time too long for destination"));
-                        goto cleanup;
-                    }
-                    param->value = (sys + irq + softirq) * TICK_TO_NSEC;
-                    break;
-
-                case 1: /* fill user cpu time here */
-                    if (virStrcpyStatic(param->field, VIR_NODE_CPU_STATS_USER) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       "%s", _("Field kernel cpu time too long for destination"));
-                        goto cleanup;
-                    }
-                    param->value = (usr + ni) * TICK_TO_NSEC;
-                    break;
-
-                case 2: /* fill idle cpu time here */
-                    if (virStrcpyStatic(param->field, VIR_NODE_CPU_STATS_IDLE) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       "%s", _("Field kernel cpu time too long for destination"));
-                        goto cleanup;
-                    }
-                    param->value = idle * TICK_TO_NSEC;
-                    break;
-
-                case 3: /* fill iowait cpu time here */
-                    if (virStrcpyStatic(param->field, VIR_NODE_CPU_STATS_IOWAIT) == NULL) {
-                        virReportError(VIR_ERR_INTERNAL_ERROR,
-                                       "%s", _("Field kernel cpu time too long for destination"));
-                        goto cleanup;
-                    }
-                    param->value = iowait * TICK_TO_NSEC;
-                    break;
-
-                default:
-                    break;
-                    /* should not hit here */
-                }
-            }
+            if (virNodeCPUStatsAssign(&params[0], VIR_NODE_CPU_STATS_KERNEL,
+                                      (sys + irq + softirq) * TICK_TO_NSEC) < 0)
+                goto cleanup;
+
+            if (virNodeCPUStatsAssign(&params[1], VIR_NODE_CPU_STATS_USER,
+                                      (usr + ni) * TICK_TO_NSEC) < 0)
+                goto cleanup;
+
+            if (virNodeCPUStatsAssign(&params[2], VIR_NODE_CPU_STATS_IDLE,
+                                      idle * TICK_TO_NSEC) < 0)
+                goto cleanup;
+
+            if (virNodeCPUStatsAssign(&params[3], VIR_NODE_CPU_STATS_IOWAIT,
+                                      iowait * TICK_TO_NSEC) < 0)
+                goto cleanup;
+
             ret = 0;
             goto cleanup;
         }