package org.sef4j.callstack.handlers; import org.sef4j.callstack.CallStackElt; import org.sef4j.callstack.CallStackPushPopHandler; import org.sef4j.callstack.stats.PerfStats; import org.sef4j.callstack.stats.ThreadTimeUtils; /** * CallStackPushPopHandler to update PerfStats for a single level of push()/pop() */ public class SinglePerfStatsUpdaterCallStackHandler extends CallStackPushPopHandler { private final PerfStats perfStats; private int level; public SinglePerfStatsUpdaterCallStackHandler(PerfStats perfStats) { this.perfStats = perfStats; } @Override public void onPush(CallStackElt stackElt) { if (level == 0) { stackElt.onPushAddCallStackPushPopHandler(this); level++; } } @Override public void onPop(CallStackElt stackElt) { if (level == 1) { level--; long elapsedTime = ThreadTimeUtils.nanosToApproxMillis( stackElt.getEndTime() - stackElt.getStartTime()); long elapsedThreadUserTime = ThreadTimeUtils.nanosToApproxMillis( stackElt.getThreadUserEndTime() - stackElt.getThreadUserStartTime()); long elapsedThreadCpuTime = ThreadTimeUtils.nanosToApproxMillis( stackElt.getThreadCpuEndTime() - stackElt.getThreadCpuStartTime()); perfStats.incr(elapsedTime, elapsedThreadUserTime, elapsedThreadCpuTime); } } @Override public void onProgressStep(CallStackElt stackElt) { // do nothing } }