tools/kvm_stat: use a namedtuple for storing the values

Use a namedtuple for storing the values as it allows to access the
fields of a tuple via names. This makes the overall code much easier
to read and to understand. Access by index is still possible as
before.

Signed-off-by: Marc Hartmayer <mhartmay@linux.vnet.ibm.com>
Tested-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Marc Hartmayer 2018-01-09 13:27:02 +01:00 committed by Paolo Bonzini
parent faa312a543
commit 006f1548ac

View File

@ -33,7 +33,7 @@ import resource
import struct import struct
import re import re
import subprocess import subprocess
from collections import defaultdict from collections import defaultdict, namedtuple
VMX_EXIT_REASONS = { VMX_EXIT_REASONS = {
'EXCEPTION_NMI': 0, 'EXCEPTION_NMI': 0,
@ -800,6 +800,9 @@ class DebugfsProvider(Provider):
self.read(2) self.read(2)
EventStat = namedtuple('EventStat', ['value', 'delta'])
class Stats(object): class Stats(object):
"""Manages the data providers and the data they provide. """Manages the data providers and the data they provide.
@ -867,10 +870,10 @@ class Stats(object):
for provider in self.providers: for provider in self.providers:
new = provider.read(by_guest=by_guest) new = provider.read(by_guest=by_guest)
for key in new if by_guest else provider.fields: for key in new if by_guest else provider.fields:
oldval = self.values.get(key, (0, 0))[0] oldval = self.values.get(key, EventStat(0, 0)).value
newval = new.get(key, 0) newval = new.get(key, 0)
newdelta = newval - oldval newdelta = newval - oldval
self.values[key] = (newval, newdelta) self.values[key] = EventStat(newval, newdelta)
return self.values return self.values
def toggle_display_guests(self, to_pid): def toggle_display_guests(self, to_pid):
@ -1083,28 +1086,28 @@ class Tui(object):
total = 0. total = 0.
for key in stats.keys(): for key in stats.keys():
if key.find('(') is -1: if key.find('(') is -1:
total += stats[key][0] total += stats[key].value
if self._sorting == SORT_DEFAULT: if self._sorting == SORT_DEFAULT:
def sortkey((_k, v)): def sortkey((_k, v)):
# sort by (delta value, overall value) # sort by (delta value, overall value)
return (v[1], v[0]) return (v.delta, v.value)
else: else:
def sortkey((_k, v)): def sortkey((_k, v)):
# sort by overall value # sort by overall value
return v[0] return v.value
tavg = 0 tavg = 0
for key, values in sorted(stats.items(), key=sortkey, reverse=True): for key, values in sorted(stats.items(), key=sortkey, reverse=True):
if row >= self.screen.getmaxyx()[0] - 1: if row >= self.screen.getmaxyx()[0] - 1:
break break
if not values[0] and not values[1]: if not values.value and not values.delta:
break break
if values[0] is not None: if values.value is not None:
cur = int(round(values[1] / sleeptime)) if values[1] else '' cur = int(round(values.delta / sleeptime)) if values.delta else ''
if self._display_guests: if self._display_guests:
key = self.get_gname_from_pid(key) key = self.get_gname_from_pid(key)
self.screen.addstr(row, 1, '%-40s %10d%7.1f %8s' % self.screen.addstr(row, 1, '%-40s %10d%7.1f %8s' %
(key, values[0], values[0] * 100 / total, (key, values.value, values.value * 100 / total,
cur)) cur))
if cur is not '' and key.find('(') is -1: if cur is not '' and key.find('(') is -1:
tavg += cur tavg += cur
@ -1375,7 +1378,7 @@ def batch(stats):
s = stats.get() s = stats.get()
for key in sorted(s.keys()): for key in sorted(s.keys()):
values = s[key] values = s[key]
print('%-42s%10d%10d' % (key, values[0], values[1])) print('%-42s%10d%10d' % (key, values.value, values.delta))
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
@ -1392,7 +1395,7 @@ def log(stats):
def statline(): def statline():
s = stats.get() s = stats.get()
for k in keys: for k in keys:
print(' %9d' % s[k][1], end=' ') print(' %9d' % s[k].delta, end=' ')
print() print()
line = 0 line = 0
banner_repeat = 20 banner_repeat = 20