#! /usr/bin/env python
# SPDX-License-Identifier: GPL-2.0
"""Example showing how to enable a tracepoint and access its fields."""
# -*- python -*-
# -*- coding: utf-8 -*-

import perf

def change_proctitle():
    try:
        import setproctitle
        setproctitle.setproctitle("tracepoint.py")
    except ImportError:
        print("Install the setproctitle python package to help with top and friends")

def main():
    change_proctitle()
    cpus    = perf.cpu_map()
    threads = perf.thread_map(-1)
    evlist = perf.parse_events("sched:sched_switch", cpus, threads)
    # Disable tracking of mmaps and similar that are unnecessary.
    for ev in evlist:
        ev.tracking = False
    # Configure evsels with default record options.
    evlist.config()
    # Simplify the sample_type and read_format of evsels
    for ev in evlist:
        ev.sample_type = ev.sample_type & ~perf.SAMPLE_IP
        ev.read_format = 0

    evlist.open()
    evlist.mmap()
    evlist.enable()

    while True:
        evlist.poll(timeout = -1)
        for cpu in cpus:
            event = evlist.read_on_cpu(cpu)
            if not event:
                continue

            if not isinstance(event, perf.sample_event):
                continue

            print("time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
                   event.sample_time,
                   event.prev_comm,
                   event.prev_pid,
                   event.prev_prio,
                   event.prev_state,
                   event.next_comm,
                   event.next_pid,
                   event.next_prio))

if __name__ == '__main__':
    main()
