On 01/14/2016 11:26 AM, Peter Krempa wrote:
Simplify the code by extracting a common code path.
---
tools/virsh-domain.c | 55 +++++++++++++++++++++++-----------------------------
1 file changed, 24 insertions(+), 31 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 62acecb..ad720cf 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -7237,12 +7237,31 @@ static const vshCmdOptDef opts_cpu_stats[] = {
{.name = NULL}
};
+static void
+vshCPUStatsPrintField(vshControl *ctl,
+ virTypedParameterPtr param)
+{
+ vshPrint(ctl, "\t%-12s ", param->field);
+ if ((STREQ(param->field, VIR_DOMAIN_CPU_STATS_CPUTIME) ||
+ STREQ(param->field, VIR_DOMAIN_CPU_STATS_USERTIME) ||
+ STREQ(param->field, VIR_DOMAIN_CPU_STATS_SYSTEMTIME)) &&
+ param->type == VIR_TYPED_PARAM_ULLONG) {
+ vshPrint(ctl, "%9lld.%09lld seconds\n",
+ param->value.ul / 1000000000,
+ param->value.ul % 1000000000);
+ } else {
+ char *s = vshGetTypedParamValue(ctl, param);
Existing, but perhaps of interest to note that vshGetTypedParamValue for
VIR_TYPED_PARAM_BOOLEAN or VIR_TYPED_PARAM_STRING may return a NULL
'str', even though the 'ret' check succeeded...
Not related to this particular issue, but since I looked at the called
function I figured I'd at least note it.
John
+ vshPrint(ctl, "%s\n", s);
+ VIR_FREE(s);
+ }
+}
+
static bool
cmdCPUStats(vshControl *ctl, const vshCmd *cmd)
{
virDomainPtr dom;
virTypedParameterPtr params = NULL;
- int pos, max_id, cpu = 0, show_count = -1, nparams = 0, stats_per_cpu;
+ int max_id, cpu = 0, show_count = -1, nparams = 0, stats_per_cpu;
size_t i, j;
bool show_total = false, show_per_cpu = false;
unsigned int flags = 0;
@@ -7317,21 +7336,8 @@ cmdCPUStats(vshControl *ctl, const vshCmd *cmd)
continue;
vshPrint(ctl, "CPU%zu:\n", cpu + i);
- for (j = 0; j < nparams; j++) {
- pos = i * nparams + j;
- vshPrint(ctl, "\t%-12s ", params[pos].field);
- if ((STREQ(params[pos].field, VIR_DOMAIN_CPU_STATS_CPUTIME) ||
- STREQ(params[pos].field, VIR_DOMAIN_CPU_STATS_VCPUTIME))
&&
- params[j].type == VIR_TYPED_PARAM_ULLONG) {
- vshPrint(ctl, "%9lld.%09lld seconds\n",
- params[pos].value.ul / 1000000000,
- params[pos].value.ul % 1000000000);
- } else {
- char *s = vshGetTypedParamValue(ctl, ¶ms[pos]);
- vshPrint(ctl, _("%s\n"), s);
- VIR_FREE(s);
- }
- }
+ for (j = 0; j < nparams; j++)
+ vshCPUStatsPrintField(ctl, params + (i * nparams + j));
}
cpu += ncpus;
show_count -= ncpus;
@@ -7363,21 +7369,8 @@ cmdCPUStats(vshControl *ctl, const vshCmd *cmd)
goto failed_stats;
vshPrint(ctl, _("Total:\n"));
- for (i = 0; i < stats_per_cpu; i++) {
- vshPrint(ctl, "\t%-12s ", params[i].field);
- if ((STREQ(params[i].field, VIR_DOMAIN_CPU_STATS_CPUTIME) ||
- STREQ(params[i].field, VIR_DOMAIN_CPU_STATS_USERTIME) ||
- STREQ(params[i].field, VIR_DOMAIN_CPU_STATS_SYSTEMTIME)) &&
- params[i].type == VIR_TYPED_PARAM_ULLONG) {
- vshPrint(ctl, "%9lld.%09lld seconds\n",
- params[i].value.ul / 1000000000,
- params[i].value.ul % 1000000000);
- } else {
- char *s = vshGetTypedParamValue(ctl, ¶ms[i]);
- vshPrint(ctl, "%s\n", s);
- VIR_FREE(s);
- }
- }
+ for (i = 0; i < stats_per_cpu; i++)
+ vshCPUStatsPrintField(ctl, params + i);
ret = true;