#!/usr/bin/python

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

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

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


b=BPF(src_file="dbus-connection-message-size.c", debug=0)
b.attach_uprobe(name="dbus-1", sym="_dbus_connection_message_sent_unlocked", fn_name="dbus_message_size")
b.attach_uprobe(name="gio-2.0", sym="g_dbus_message_to_blob", fn_name="g_get_size_pointer")
b.attach_uretprobe(name="gio-2.0", sym="g_dbus_message_to_blob", fn_name="g_get_message_size")

interval = 5
loops = 100
count = 0

while (1):
	count += 1
	if count == loops:
		exit()
	sleep(interval)
	print ("\n%d:\n" % count)
	if display_mode == 0:
		stats = b["msg_size"]
		for v, p in sorted(stats.items(), key=lambda stats: stats[1].bytes, reverse=True):
			print("%10d %20s %20ld" %(v.pid, v.comm.encode('string-escape'), int(p.bytes)))
	else:
		b["msg_size_hist"].print_log2_hist("bytes")
