| 1 | |
| 2 | |
| 3 | Live event session helper using perf.evlist.
|
| 4 |
|
| 5 | This module provides a LiveSession class that allows running a callback
|
| 6 | for each event collected live from the system, similar to perf.session
|
| 7 | but without requiring a perf.data file.
|
| 8 |
|
| 9 |
|
| 10 | import perf
|
| 11 |
|
| 12 |
|
| 13 | class LiveSession:
|
| 14 |
|
| 15 |
|
| 16 | def __init__(self, event_string: str, sample_callback):
|
| 17 | self.event_string = event_string
|
| 18 | self.sample_callback = sample_callback
|
| 19 | |
| 20 | self.cpus = perf.cpu_map()
|
| 21 | |
| 22 | self.evlist = perf.parse_events(self.event_string, self.cpus)
|
| 23 | self.evlist.config()
|
| 24 |
|
| 25 | def run(self):
|
| 26 |
|
| 27 | try:
|
| 28 | self.evlist.open()
|
| 29 | self.evlist.mmap()
|
| 30 | self.evlist.enable()
|
| 31 |
|
| 32 | while True:
|
| 33 | |
| 34 | try:
|
| 35 | self.evlist.poll(100)
|
| 36 | except InterruptedError:
|
| 37 | continue
|
| 38 | for cpu in self.cpus:
|
| 39 | for _ in range(1000): |
| 40 | try:
|
| 41 | event = self.evlist.read_on_cpu(cpu)
|
| 42 | except TypeError as e:
|
| 43 | if "Unknown CPU" in str(e):
|
| 44 | |
| 45 | break
|
| 46 | if "Unexpected header type" in str(e):
|
| 47 | |
| 48 | continue
|
| 49 | raise
|
| 50 |
|
| 51 | if event is None:
|
| 52 | break
|
| 53 |
|
| 54 | if event.type == perf.RECORD_SAMPLE:
|
| 55 | self.sample_callback(event)
|
| 56 | except KeyboardInterrupt:
|
| 57 | pass
|
| 58 | finally:
|
| 59 | self.evlist.close()
|