aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Raspl <stefan.raspl@de.ibm.com>2018-02-22 06:16:26 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2018-02-23 19:43:43 -0500
commitc0e8c21eae616ed8703c1b4b01046a1578ee875c (patch)
tree6cfb052a90d77324383bf8d2f89459f642e8a68d
parent1fd6a708c8438403dee17eb411cf81ffba13cf43 (diff)
tools/kvm_stat: mark private methods as such
Helps quite a bit reading the code when it's obvious when a method is intended for internal use only. Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rwxr-xr-xtools/kvm/kvm_stat/kvm_stat132
1 files changed, 66 insertions, 66 deletions
diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
index c5c8e9295b91..c09b7428f563 100755
--- a/tools/kvm/kvm_stat/kvm_stat
+++ b/tools/kvm/kvm_stat/kvm_stat
@@ -373,8 +373,8 @@ class Event(object):
373 self.syscall = self.libc.syscall 373 self.syscall = self.libc.syscall
374 self.name = name 374 self.name = name
375 self.fd = None 375 self.fd = None
376 self.setup_event(group, trace_cpu, trace_pid, trace_point, 376 self._setup_event(group, trace_cpu, trace_pid, trace_point,
377 trace_filter, trace_set) 377 trace_filter, trace_set)
378 378
379 def __del__(self): 379 def __del__(self):
380 """Closes the event's file descriptor. 380 """Closes the event's file descriptor.
@@ -387,7 +387,7 @@ class Event(object):
387 if self.fd: 387 if self.fd:
388 os.close(self.fd) 388 os.close(self.fd)
389 389
390 def perf_event_open(self, attr, pid, cpu, group_fd, flags): 390 def _perf_event_open(self, attr, pid, cpu, group_fd, flags):
391 """Wrapper for the sys_perf_evt_open() syscall. 391 """Wrapper for the sys_perf_evt_open() syscall.
392 392
393 Used to set up performance events, returns a file descriptor or -1 393 Used to set up performance events, returns a file descriptor or -1
@@ -406,7 +406,7 @@ class Event(object):
406 ctypes.c_int(pid), ctypes.c_int(cpu), 406 ctypes.c_int(pid), ctypes.c_int(cpu),
407 ctypes.c_int(group_fd), ctypes.c_long(flags)) 407 ctypes.c_int(group_fd), ctypes.c_long(flags))
408 408
409 def setup_event_attribute(self, trace_set, trace_point): 409 def _setup_event_attribute(self, trace_set, trace_point):
410 """Returns an initialized ctype perf_event_attr struct.""" 410 """Returns an initialized ctype perf_event_attr struct."""
411 411
412 id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', trace_set, 412 id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', trace_set,
@@ -416,8 +416,8 @@ class Event(object):
416 event_attr.config = int(open(id_path).read()) 416 event_attr.config = int(open(id_path).read())
417 return event_attr 417 return event_attr
418 418
419 def setup_event(self, group, trace_cpu, trace_pid, trace_point, 419 def _setup_event(self, group, trace_cpu, trace_pid, trace_point,
420 trace_filter, trace_set): 420 trace_filter, trace_set):
421 """Sets up the perf event in Linux. 421 """Sets up the perf event in Linux.
422 422
423 Issues the syscall to register the event in the kernel and 423 Issues the syscall to register the event in the kernel and
@@ -425,7 +425,7 @@ class Event(object):
425 425
426 """ 426 """
427 427
428 event_attr = self.setup_event_attribute(trace_set, trace_point) 428 event_attr = self._setup_event_attribute(trace_set, trace_point)
429 429
430 # First event will be group leader. 430 # First event will be group leader.
431 group_leader = -1 431 group_leader = -1
@@ -434,8 +434,8 @@ class Event(object):
434 if group.events: 434 if group.events:
435 group_leader = group.events[0].fd 435 group_leader = group.events[0].fd
436 436
437 fd = self.perf_event_open(event_attr, trace_pid, 437 fd = self._perf_event_open(event_attr, trace_pid,
438 trace_cpu, group_leader, 0) 438 trace_cpu, group_leader, 0)
439 if fd == -1: 439 if fd == -1:
440 err = ctypes.get_errno() 440 err = ctypes.get_errno()
441 raise OSError(err, os.strerror(err), 441 raise OSError(err, os.strerror(err),
@@ -497,12 +497,12 @@ class TracepointProvider(Provider):
497 """ 497 """
498 def __init__(self, pid, fields_filter): 498 def __init__(self, pid, fields_filter):
499 self.group_leaders = [] 499 self.group_leaders = []
500 self.filters = self.get_filters() 500 self.filters = self._get_filters()
501 self.update_fields(fields_filter) 501 self.update_fields(fields_filter)
502 self.pid = pid 502 self.pid = pid
503 503
504 @staticmethod 504 @staticmethod
505 def get_filters(): 505 def _get_filters():
506 """Returns a dict of trace events, their filter ids and 506 """Returns a dict of trace events, their filter ids and
507 the values that can be filtered. 507 the values that can be filtered.
508 508
@@ -518,7 +518,7 @@ class TracepointProvider(Provider):
518 filters['kvm_exit'] = ('exit_reason', ARCH.exit_reasons) 518 filters['kvm_exit'] = ('exit_reason', ARCH.exit_reasons)
519 return filters 519 return filters
520 520
521 def get_available_fields(self): 521 def _get_available_fields(self):
522 """Returns a list of available event's of format 'event name(filter 522 """Returns a list of available event's of format 'event name(filter
523 name)'. 523 name)'.
524 524
@@ -546,11 +546,11 @@ class TracepointProvider(Provider):
546 546
547 def update_fields(self, fields_filter): 547 def update_fields(self, fields_filter):
548 """Refresh fields, applying fields_filter""" 548 """Refresh fields, applying fields_filter"""
549 self.fields = [field for field in self.get_available_fields() 549 self.fields = [field for field in self._get_available_fields()
550 if self.is_field_wanted(fields_filter, field)] 550 if self.is_field_wanted(fields_filter, field)]
551 551
552 @staticmethod 552 @staticmethod
553 def get_online_cpus(): 553 def _get_online_cpus():
554 """Returns a list of cpu id integers.""" 554 """Returns a list of cpu id integers."""
555 def parse_int_list(list_string): 555 def parse_int_list(list_string):
556 """Returns an int list from a string of comma separated integers and 556 """Returns an int list from a string of comma separated integers and
@@ -572,17 +572,17 @@ class TracepointProvider(Provider):
572 cpu_string = cpu_list.readline() 572 cpu_string = cpu_list.readline()
573 return parse_int_list(cpu_string) 573 return parse_int_list(cpu_string)
574 574
575 def setup_traces(self): 575 def _setup_traces(self):
576 """Creates all event and group objects needed to be able to retrieve 576 """Creates all event and group objects needed to be able to retrieve
577 data.""" 577 data."""
578 fields = self.get_available_fields() 578 fields = self._get_available_fields()
579 if self._pid > 0: 579 if self._pid > 0:
580 # Fetch list of all threads of the monitored pid, as qemu 580 # Fetch list of all threads of the monitored pid, as qemu
581 # starts a thread for each vcpu. 581 # starts a thread for each vcpu.
582 path = os.path.join('/proc', str(self._pid), 'task') 582 path = os.path.join('/proc', str(self._pid), 'task')
583 groupids = self.walkdir(path)[1] 583 groupids = self.walkdir(path)[1]
584 else: 584 else:
585 groupids = self.get_online_cpus() 585 groupids = self._get_online_cpus()
586 586
587 # The constant is needed as a buffer for python libs, std 587 # The constant is needed as a buffer for python libs, std
588 # streams and other files that the script opens. 588 # streams and other files that the script opens.
@@ -660,7 +660,7 @@ class TracepointProvider(Provider):
660 # The garbage collector will get rid of all Event/Group 660 # The garbage collector will get rid of all Event/Group
661 # objects and open files after removing the references. 661 # objects and open files after removing the references.
662 self.group_leaders = [] 662 self.group_leaders = []
663 self.setup_traces() 663 self._setup_traces()
664 self.fields = self._fields 664 self.fields = self._fields
665 665
666 def read(self, by_guest=0): 666 def read(self, by_guest=0):
@@ -689,9 +689,9 @@ class DebugfsProvider(Provider):
689 self.paths = [] 689 self.paths = []
690 self.pid = pid 690 self.pid = pid
691 if include_past: 691 if include_past:
692 self.restore() 692 self._restore()
693 693
694 def get_available_fields(self): 694 def _get_available_fields(self):
695 """"Returns a list of available fields. 695 """"Returns a list of available fields.
696 696
697 The fields are all available KVM debugfs files 697 The fields are all available KVM debugfs files
@@ -701,7 +701,7 @@ class DebugfsProvider(Provider):
701 701
702 def update_fields(self, fields_filter): 702 def update_fields(self, fields_filter):
703 """Refresh fields, applying fields_filter""" 703 """Refresh fields, applying fields_filter"""
704 self._fields = [field for field in self.get_available_fields() 704 self._fields = [field for field in self._get_available_fields()
705 if self.is_field_wanted(fields_filter, field)] 705 if self.is_field_wanted(fields_filter, field)]
706 706
707 @property 707 @property
@@ -755,7 +755,7 @@ class DebugfsProvider(Provider):
755 paths.append(dir) 755 paths.append(dir)
756 for path in paths: 756 for path in paths:
757 for field in self._fields: 757 for field in self._fields:
758 value = self.read_field(field, path) 758 value = self._read_field(field, path)
759 key = path + field 759 key = path + field
760 if reset == 1: 760 if reset == 1:
761 self._baseline[key] = value 761 self._baseline[key] = value
@@ -776,7 +776,7 @@ class DebugfsProvider(Provider):
776 776
777 return results 777 return results
778 778
779 def read_field(self, field, path): 779 def _read_field(self, field, path):
780 """Returns the value of a single field from a specific VM.""" 780 """Returns the value of a single field from a specific VM."""
781 try: 781 try:
782 return int(open(os.path.join(PATH_DEBUGFS_KVM, 782 return int(open(os.path.join(PATH_DEBUGFS_KVM,
@@ -791,7 +791,7 @@ class DebugfsProvider(Provider):
791 self._baseline = {} 791 self._baseline = {}
792 self.read(1) 792 self.read(1)
793 793
794 def restore(self): 794 def _restore(self):
795 """Reset field counters""" 795 """Reset field counters"""
796 self._baseline = {} 796 self._baseline = {}
797 self.read(2) 797 self.read(2)
@@ -808,13 +808,12 @@ class Stats(object):
808 808
809 """ 809 """
810 def __init__(self, options): 810 def __init__(self, options):
811 self.providers = self.get_providers(options) 811 self.providers = self._get_providers(options)
812 self._pid_filter = options.pid 812 self._pid_filter = options.pid
813 self._fields_filter = options.fields 813 self._fields_filter = options.fields
814 self.values = {} 814 self.values = {}
815 815
816 @staticmethod 816 def _get_providers(self, options):
817 def get_providers(options):
818 """Returns a list of data providers depending on the passed options.""" 817 """Returns a list of data providers depending on the passed options."""
819 providers = [] 818 providers = []
820 819
@@ -826,7 +825,7 @@ class Stats(object):
826 825
827 return providers 826 return providers
828 827
829 def update_provider_filters(self): 828 def _update_provider_filters(self):
830 """Propagates fields filters to providers.""" 829 """Propagates fields filters to providers."""
831 # As we reset the counters when updating the fields we can 830 # As we reset the counters when updating the fields we can
832 # also clear the cache of old values. 831 # also clear the cache of old values.
@@ -847,7 +846,7 @@ class Stats(object):
847 def fields_filter(self, fields_filter): 846 def fields_filter(self, fields_filter):
848 if fields_filter != self._fields_filter: 847 if fields_filter != self._fields_filter:
849 self._fields_filter = fields_filter 848 self._fields_filter = fields_filter
850 self.update_provider_filters() 849 self._update_provider_filters()
851 850
852 @property 851 @property
853 def pid_filter(self): 852 def pid_filter(self):
@@ -969,7 +968,7 @@ class Tui(object):
969 968
970 return res 969 return res
971 970
972 def print_all_gnames(self, row): 971 def _print_all_gnames(self, row):
973 """Print a list of all running guests along with their pids.""" 972 """Print a list of all running guests along with their pids."""
974 self.screen.addstr(row, 2, '%8s %-60s' % 973 self.screen.addstr(row, 2, '%8s %-60s' %
975 ('Pid', 'Guest Name (fuzzy list, might be ' 974 ('Pid', 'Guest Name (fuzzy list, might be '
@@ -1032,7 +1031,7 @@ class Tui(object):
1032 1031
1033 return name 1032 return name
1034 1033
1035 def update_drilldown(self): 1034 def _update_drilldown(self):
1036 """Sets or removes a filter that only allows fields without braces.""" 1035 """Sets or removes a filter that only allows fields without braces."""
1037 if not self.stats.fields_filter: 1036 if not self.stats.fields_filter:
1038 self.stats.fields_filter = DEFAULT_REGEX 1037 self.stats.fields_filter = DEFAULT_REGEX
@@ -1040,11 +1039,11 @@ class Tui(object):
1040 elif self.stats.fields_filter == DEFAULT_REGEX: 1039 elif self.stats.fields_filter == DEFAULT_REGEX:
1041 self.stats.fields_filter = None 1040 self.stats.fields_filter = None
1042 1041
1043 def update_pid(self, pid): 1042 def _update_pid(self, pid):
1044 """Propagates pid selection to stats object.""" 1043 """Propagates pid selection to stats object."""
1045 self.stats.pid_filter = pid 1044 self.stats.pid_filter = pid
1046 1045
1047 def refresh_header(self, pid=None): 1046 def _refresh_header(self, pid=None):
1048 """Refreshes the header.""" 1047 """Refreshes the header."""
1049 if pid is None: 1048 if pid is None:
1050 pid = self.stats.pid_filter 1049 pid = self.stats.pid_filter
@@ -1075,7 +1074,7 @@ class Tui(object):
1075 self.screen.addstr(4, 1, 'Collecting data...') 1074 self.screen.addstr(4, 1, 'Collecting data...')
1076 self.screen.refresh() 1075 self.screen.refresh()
1077 1076
1078 def refresh_body(self, sleeptime): 1077 def _refresh_body(self, sleeptime):
1079 row = 3 1078 row = 3
1080 self.screen.move(row, 0) 1079 self.screen.move(row, 0)
1081 self.screen.clrtobot() 1080 self.screen.clrtobot()
@@ -1124,7 +1123,7 @@ class Tui(object):
1124 curses.A_BOLD) 1123 curses.A_BOLD)
1125 self.screen.refresh() 1124 self.screen.refresh()
1126 1125
1127 def show_msg(self, text): 1126 def _show_msg(self, text):
1128 """Display message centered text and exit on key press""" 1127 """Display message centered text and exit on key press"""
1129 hint = 'Press any key to continue' 1128 hint = 'Press any key to continue'
1130 curses.cbreak() 1129 curses.cbreak()
@@ -1139,7 +1138,7 @@ class Tui(object):
1139 curses.A_STANDOUT) 1138 curses.A_STANDOUT)
1140 self.screen.getkey() 1139 self.screen.getkey()
1141 1140
1142 def show_help_interactive(self): 1141 def _show_help_interactive(self):
1143 """Display help with list of interactive commands""" 1142 """Display help with list of interactive commands"""
1144 msg = (' b toggle events by guests (debugfs only, honors' 1143 msg = (' b toggle events by guests (debugfs only, honors'
1145 ' filters)', 1144 ' filters)',
@@ -1165,9 +1164,9 @@ class Tui(object):
1165 self.screen.addstr(row, 0, line) 1164 self.screen.addstr(row, 0, line)
1166 row += 1 1165 row += 1
1167 self.screen.getkey() 1166 self.screen.getkey()
1168 self.refresh_header() 1167 self._refresh_header()
1169 1168
1170 def show_filter_selection(self): 1169 def _show_filter_selection(self):
1171 """Draws filter selection mask. 1170 """Draws filter selection mask.
1172 1171
1173 Asks for a valid regex and sets the fields filter accordingly. 1172 Asks for a valid regex and sets the fields filter accordingly.
@@ -1189,18 +1188,18 @@ class Tui(object):
1189 curses.noecho() 1188 curses.noecho()
1190 if len(regex) == 0: 1189 if len(regex) == 0:
1191 self.stats.fields_filter = DEFAULT_REGEX 1190 self.stats.fields_filter = DEFAULT_REGEX
1192 self.refresh_header() 1191 self._refresh_header()
1193 return 1192 return
1194 try: 1193 try:
1195 re.compile(regex) 1194 re.compile(regex)
1196 self.stats.fields_filter = regex 1195 self.stats.fields_filter = regex
1197 self.refresh_header() 1196 self._refresh_header()
1198 return 1197 return
1199 except re.error: 1198 except re.error:
1200 msg = '"' + regex + '": Not a valid regular expression' 1199 msg = '"' + regex + '": Not a valid regular expression'
1201 continue 1200 continue
1202 1201
1203 def show_vm_selection_by_pid(self): 1202 def _show_vm_selection_by_pid(self):
1204 """Draws PID selection mask. 1203 """Draws PID selection mask.
1205 1204
1206 Asks for a pid until a valid pid or 0 has been entered. 1205 Asks for a pid until a valid pid or 0 has been entered.
@@ -1216,7 +1215,7 @@ class Tui(object):
1216 'This might limit the shown data to the trace ' 1215 'This might limit the shown data to the trace '
1217 'statistics.') 1216 'statistics.')
1218 self.screen.addstr(5, 0, msg) 1217 self.screen.addstr(5, 0, msg)
1219 self.print_all_gnames(7) 1218 self._print_all_gnames(7)
1220 1219
1221 curses.echo() 1220 curses.echo()
1222 self.screen.addstr(3, 0, "Pid [0 or pid]: ") 1221 self.screen.addstr(3, 0, "Pid [0 or pid]: ")
@@ -1232,13 +1231,13 @@ class Tui(object):
1232 continue 1231 continue
1233 else: 1232 else:
1234 pid = 0 1233 pid = 0
1235 self.refresh_header(pid) 1234 self._refresh_header(pid)
1236 self.update_pid(pid) 1235 self._update_pid(pid)
1237 break 1236 break
1238 except ValueError: 1237 except ValueError:
1239 msg = '"' + str(pid) + '": Not a valid pid' 1238 msg = '"' + str(pid) + '": Not a valid pid'
1240 1239
1241 def show_set_update_interval(self): 1240 def _show_set_update_interval(self):
1242 """Draws update interval selection mask.""" 1241 """Draws update interval selection mask."""
1243 msg = '' 1242 msg = ''
1244 while True: 1243 while True:
@@ -1268,9 +1267,9 @@ class Tui(object):
1268 1267
1269 except ValueError: 1268 except ValueError:
1270 msg = '"' + str(val) + '": Invalid value' 1269 msg = '"' + str(val) + '": Invalid value'
1271 self.refresh_header() 1270 self._refresh_header()
1272 1271
1273 def show_vm_selection_by_guest_name(self): 1272 def _show_vm_selection_by_guest_name(self):
1274 """Draws guest selection mask. 1273 """Draws guest selection mask.
1275 1274
1276 Asks for a guest name until a valid guest name or '' is entered. 1275 Asks for a guest name until a valid guest name or '' is entered.
@@ -1286,15 +1285,15 @@ class Tui(object):
1286 'This might limit the shown data to the trace ' 1285 'This might limit the shown data to the trace '
1287 'statistics.') 1286 'statistics.')
1288 self.screen.addstr(5, 0, msg) 1287 self.screen.addstr(5, 0, msg)
1289 self.print_all_gnames(7) 1288 self._print_all_gnames(7)
1290 curses.echo() 1289 curses.echo()
1291 self.screen.addstr(3, 0, "Guest [ENTER or guest]: ") 1290 self.screen.addstr(3, 0, "Guest [ENTER or guest]: ")
1292 gname = self.screen.getstr().decode(ENCODING) 1291 gname = self.screen.getstr().decode(ENCODING)
1293 curses.noecho() 1292 curses.noecho()
1294 1293
1295 if not gname: 1294 if not gname:
1296 self.refresh_header(0) 1295 self._refresh_header(0)
1297 self.update_pid(0) 1296 self._update_pid(0)
1298 break 1297 break
1299 else: 1298 else:
1300 pids = [] 1299 pids = []
@@ -1311,17 +1310,17 @@ class Tui(object):
1311 msg = '"' + gname + '": Multiple matches found, use pid ' \ 1310 msg = '"' + gname + '": Multiple matches found, use pid ' \
1312 'filter instead' 1311 'filter instead'
1313 continue 1312 continue
1314 self.refresh_header(pids[0]) 1313 self._refresh_header(pids[0])
1315 self.update_pid(pids[0]) 1314 self._update_pid(pids[0])
1316 break 1315 break
1317 1316
1318 def show_stats(self): 1317 def show_stats(self):
1319 """Refreshes the screen and processes user input.""" 1318 """Refreshes the screen and processes user input."""
1320 sleeptime = self._delay_initial 1319 sleeptime = self._delay_initial
1321 self.refresh_header() 1320 self._refresh_header()
1322 start = 0.0 # result based on init value never appears on screen 1321 start = 0.0 # result based on init value never appears on screen
1323 while True: 1322 while True:
1324 self.refresh_body(time.time() - start) 1323 self._refresh_body(time.time() - start)
1325 curses.halfdelay(int(sleeptime * 10)) 1324 curses.halfdelay(int(sleeptime * 10))
1326 start = time.time() 1325 start = time.time()
1327 sleeptime = self._delay_regular 1326 sleeptime = self._delay_regular
@@ -1330,32 +1329,33 @@ class Tui(object):
1330 if char == 'b': 1329 if char == 'b':
1331 self._display_guests = not self._display_guests 1330 self._display_guests = not self._display_guests
1332 if self.stats.toggle_display_guests(self._display_guests): 1331 if self.stats.toggle_display_guests(self._display_guests):
1333 self.show_msg(['Command not available with tracepoints' 1332 self._show_msg(['Command not available with '
1334 ' enabled', 'Restart with debugfs only ' 1333 'tracepoints enabled', 'Restart with '
1335 '(see option \'-d\') and try again!']) 1334 'debugfs only (see option \'-d\') and '
1335 'try again!'])
1336 self._display_guests = not self._display_guests 1336 self._display_guests = not self._display_guests
1337 self.refresh_header() 1337 self._refresh_header()
1338 if char == 'c': 1338 if char == 'c':
1339 self.stats.fields_filter = DEFAULT_REGEX 1339 self.stats.fields_filter = DEFAULT_REGEX
1340 self.refresh_header(0) 1340 self._refresh_header(0)
1341 self.update_pid(0) 1341 self._update_pid(0)
1342 if char == 'f': 1342 if char == 'f':
1343 curses.curs_set(1) 1343 curses.curs_set(1)
1344 self.show_filter_selection() 1344 self._show_filter_selection()
1345 curses.curs_set(0) 1345 curses.curs_set(0)
1346 sleeptime = self._delay_initial 1346 sleeptime = self._delay_initial
1347 if char == 'g': 1347 if char == 'g':
1348 curses.curs_set(1) 1348 curses.curs_set(1)
1349 self.show_vm_selection_by_guest_name() 1349 self._show_vm_selection_by_guest_name()
1350 curses.curs_set(0) 1350 curses.curs_set(0)
1351 sleeptime = self._delay_initial 1351 sleeptime = self._delay_initial
1352 if char == 'h': 1352 if char == 'h':
1353 self.show_help_interactive() 1353 self._show_help_interactive()
1354 if char == 'o': 1354 if char == 'o':
1355 self._sorting = not self._sorting 1355 self._sorting = not self._sorting
1356 if char == 'p': 1356 if char == 'p':
1357 curses.curs_set(1) 1357 curses.curs_set(1)
1358 self.show_vm_selection_by_pid() 1358 self._show_vm_selection_by_pid()
1359 curses.curs_set(0) 1359 curses.curs_set(0)
1360 sleeptime = self._delay_initial 1360 sleeptime = self._delay_initial
1361 if char == 'q': 1361 if char == 'q':
@@ -1364,11 +1364,11 @@ class Tui(object):
1364 self.stats.reset() 1364 self.stats.reset()
1365 if char == 's': 1365 if char == 's':
1366 curses.curs_set(1) 1366 curses.curs_set(1)
1367 self.show_set_update_interval() 1367 self._show_set_update_interval()
1368 curses.curs_set(0) 1368 curses.curs_set(0)
1369 sleeptime = self._delay_initial 1369 sleeptime = self._delay_initial
1370 if char == 'x': 1370 if char == 'x':
1371 self.update_drilldown() 1371 self._update_drilldown()
1372 # prevents display of current values on next refresh 1372 # prevents display of current values on next refresh
1373 self.stats.get(self._display_guests) 1373 self.stats.get(self._display_guests)
1374 except KeyboardInterrupt: 1374 except KeyboardInterrupt: