from perfmon import *
import os
import sys
class Session:
def __init__(self, events):
self.system = System()
self.event_names = events
self.events = []
self.fds = []
for e in events:
err, encoding = pfm_get_perf_event_encoding(e, PFM_PLM0 | PFM_PLM3,
None, None)
self.events.append(encoding)
def __del__(self):
pass
def read(self, fd):
return os.read(fd, 8)
class SystemWideSession(Session):
def __init__(self, cpus, events):
self.cpus = cpus
Session.__init__(self, events)
def __del__(self):
Session.__del__(self)
def start(self):
self.cpu_fds = []
for c in self.cpus:
self.cpu_fds.append([])
cur_cpu_fds = self.cpu_fds[-1]
for e in self.events:
cur_cpu_fds.append(perf_event_open(e, -1, c, -1, 0))
def read(self, c, i):
index = self.cpus.index(c)
return Session.read(self, self.cpu_fds[index][i])
class PerThreadSession(Session):
def __init__(self, pid, events):
self.pid = pid
Session.__init__(self, events)
def __del__(self):
Session.__del__(self)
def start(self):
for e in self.events:
self.fds.append(perf_event_open(e, self.pid, -1, -1, 0))
def read(self, i):
return Session.read(self, self.fds[i])