#!/usr/bin/python

from bcc import BPF
from time import sleep
from ctypes import c_ushort, c_int, c_ulonglong
from sys import argv

def usage():
	print("USAGE: %s [--process|histogram]" % argv[0])
	exit()

print("Hit Ctrl-C to end.")
count = 100
interval = 5
loop = 0

mode = "histogram"
if len(argv) != 2:
	usage()
if argv[1] == "--histogram":
	mode = "histogram"
elif argv[1] == "--process":
	mode = "process"
else:
	usage()

b = BPF(src_file="dbus-latency.c")

b.attach_uprobe(name="dbus-1", sym="_dbus_connection_message_sent_unlocked", fn_name="get_msg_addr")
b.attach_uprobe(name="dbus-1", sym="dbus_connection_dispatch", fn_name="get_msg_latency")
b.attach_uprobe(name="gio-2.0", sym="g_dbus_message_lock", fn_name="g_get_latency")


while (1):
	sleep(interval)
	loop = loop + 1
	print("\n%d:" % loop)
	if mode =="histogram":
		b["latency_histo"].print_log2_hist("ms")
	else:
		print ("%10s %20s %10s %10s %10s" % ("PID", "COMM", "MIN", "AVG", "MAX"))
		latency = b["msg_latency"]
		for v, p in sorted(latency.items(), key=lambda latency: latency[1].avg, reverse=True):
			print("%10d %20s %10d %10d %10d" % (v.pid, v.comm.encode('string-escape'), int(p.min), int(p.avg), int(p.max)))

