diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2018-01-29 12:08:56 -0200 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-02-17 15:30:15 -0200 |
commit | cf0c074cc8c7e6fe858d621ea59976d2159d51bf (patch) | |
tree | 04688c8b7d64d1105dd6ca41c05c337c68731ab7 /linux/LinuxProcessList.c | |
parent | 9c40c9a0e7e43577e77a372c18aa733ee17d81c2 (diff) |
Add IPC performance counter for Linux
Diffstat (limited to 'linux/LinuxProcessList.c')
-rw-r--r-- | linux/LinuxProcessList.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 753a478e..bba611f0 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -660,6 +660,32 @@ static void LinuxProcessList_readDelayAcctData(LinuxProcessList* this, LinuxProc #endif +#ifdef HAVE_PERFCOUNTERS + +static void LinuxProcessList_readPerfCounters(LinuxProcess* lp) { + if (!lp->cycleCounter) { + lp->cycleCounter = PerfCounter_new(lp->super.pid, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); + } + if (!lp->insnCounter) { + lp->insnCounter = PerfCounter_new(lp->super.pid, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); + } + bool cOk = PerfCounter_read(lp->cycleCounter); + bool iOk = PerfCounter_read(lp->insnCounter); + if (cOk && iOk) { + uint64_t i = PerfCounter_delta(lp->insnCounter); + uint64_t c = PerfCounter_delta(lp->cycleCounter); + if (c > 0) { + lp->ipc = (double)i / c; + } else { + lp->ipc = 0; + } + } else { + lp->ipc = -1; + } +} + +#endif + static void setCommand(Process* process, const char* command, int len) { if (process->comm && process->commLen >= len) { strncpy(process->comm, command, len + 1); @@ -871,6 +897,11 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char* if (ss->flags & PROCESS_FLAG_LINUX_OOM) LinuxProcessList_readOomData(lp, dirname, name); + #ifdef HAVE_PERFCOUNTERS + if (ss->flags & PROCESS_FLAG_LINUX_HPC) + LinuxProcessList_readPerfCounters(lp); + #endif + if (proc->state == 'Z' && (proc->basenameOffset == 0)) { proc->basenameOffset = -1; setCommand(proc, command, commLen); |