162306a36Sopenharmony_ci# system call top
262306a36Sopenharmony_ci# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
362306a36Sopenharmony_ci# Licensed under the terms of the GNU GPL License version 2
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# Periodically displays system-wide system call totals, broken down by
662306a36Sopenharmony_ci# syscall.  If a [comm] arg is specified, only syscalls called by
762306a36Sopenharmony_ci# [comm] are displayed. If an [interval] arg is specified, the display
862306a36Sopenharmony_ci# will be refreshed every [interval] seconds.  The default interval is
962306a36Sopenharmony_ci# 3 seconds.
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cifrom __future__ import print_function
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciimport os, sys, time
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_citry:
1662306a36Sopenharmony_ci	import thread
1762306a36Sopenharmony_ciexcept ImportError:
1862306a36Sopenharmony_ci	import _thread as thread
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cisys.path.append(os.environ['PERF_EXEC_PATH'] + \
2162306a36Sopenharmony_ci	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cifrom perf_trace_context import *
2462306a36Sopenharmony_cifrom Core import *
2562306a36Sopenharmony_cifrom Util import *
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ciusage = "perf script -s sctop.py [comm] [interval]\n";
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cifor_comm = None
3062306a36Sopenharmony_cidefault_interval = 3
3162306a36Sopenharmony_ciinterval = default_interval
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciif len(sys.argv) > 3:
3462306a36Sopenharmony_ci	sys.exit(usage)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciif len(sys.argv) > 2:
3762306a36Sopenharmony_ci	for_comm = sys.argv[1]
3862306a36Sopenharmony_ci	interval = int(sys.argv[2])
3962306a36Sopenharmony_cielif len(sys.argv) > 1:
4062306a36Sopenharmony_ci	try:
4162306a36Sopenharmony_ci		interval = int(sys.argv[1])
4262306a36Sopenharmony_ci	except ValueError:
4362306a36Sopenharmony_ci		for_comm = sys.argv[1]
4462306a36Sopenharmony_ci		interval = default_interval
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cisyscalls = autodict()
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cidef trace_begin():
4962306a36Sopenharmony_ci	thread.start_new_thread(print_syscall_totals, (interval,))
5062306a36Sopenharmony_ci	pass
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cidef raw_syscalls__sys_enter(event_name, context, common_cpu,
5362306a36Sopenharmony_ci	common_secs, common_nsecs, common_pid, common_comm,
5462306a36Sopenharmony_ci	common_callchain, id, args):
5562306a36Sopenharmony_ci	if for_comm is not None:
5662306a36Sopenharmony_ci		if common_comm != for_comm:
5762306a36Sopenharmony_ci			return
5862306a36Sopenharmony_ci	try:
5962306a36Sopenharmony_ci		syscalls[id] += 1
6062306a36Sopenharmony_ci	except TypeError:
6162306a36Sopenharmony_ci		syscalls[id] = 1
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cidef syscalls__sys_enter(event_name, context, common_cpu,
6462306a36Sopenharmony_ci	common_secs, common_nsecs, common_pid, common_comm,
6562306a36Sopenharmony_ci	id, args):
6662306a36Sopenharmony_ci	raw_syscalls__sys_enter(**locals())
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cidef print_syscall_totals(interval):
6962306a36Sopenharmony_ci	while 1:
7062306a36Sopenharmony_ci		clear_term()
7162306a36Sopenharmony_ci		if for_comm is not None:
7262306a36Sopenharmony_ci			print("\nsyscall events for %s:\n" % (for_comm))
7362306a36Sopenharmony_ci		else:
7462306a36Sopenharmony_ci			print("\nsyscall events:\n")
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci		print("%-40s  %10s" % ("event", "count"))
7762306a36Sopenharmony_ci		print("%-40s  %10s" %
7862306a36Sopenharmony_ci			("----------------------------------------",
7962306a36Sopenharmony_ci			"----------"))
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci		for id, val in sorted(syscalls.items(),
8262306a36Sopenharmony_ci				key = lambda kv: (kv[1], kv[0]),
8362306a36Sopenharmony_ci				reverse = True):
8462306a36Sopenharmony_ci			try:
8562306a36Sopenharmony_ci				print("%-40s  %10d" % (syscall_name(id), val))
8662306a36Sopenharmony_ci			except TypeError:
8762306a36Sopenharmony_ci				pass
8862306a36Sopenharmony_ci		syscalls.clear()
8962306a36Sopenharmony_ci		time.sleep(interval)
90