package org.sef4j.callstack.stattree.printers.value;
import java.io.PrintWriter;
import java.util.List;
import org.sef4j.callstack.stats.BasicTimeStatsSlotInfo;
import org.sef4j.callstack.stats.PendingPerfCount;
import org.sef4j.callstack.stats.PerfStats;
import org.sef4j.core.helpers.proptree.printers.ValuePrinter;
/**
* ValuePrinter for PerfStats
*/
public class PerfStatsFieldValuePrinter implements ValuePrinter<PerfStats> {
public static final PerfStatsFieldValuePrinter ELAPSED_INSTANCE = new PerfStatsFieldValuePrinter(false, true, false, false, false);
public static final PerfStatsFieldValuePrinter DETAILED_ELAPSED_INSTANCE = new PerfStatsFieldValuePrinter(true, true, true, true, false);
public static final PerfStatsFieldValuePrinter DEFAULT_INSTANCE = ELAPSED_INSTANCE;
private final boolean printPendings;
private final boolean printElapsed;
private final boolean printCpu;
private final boolean printUser;
private final boolean printInterleavedSlots;
// ------------------------------------------------------------------------
public PerfStatsFieldValuePrinter(boolean printPendings, boolean printElapsed, boolean printCpu, boolean printUser, boolean printInterleavedSlots) {
super();
this.printPendings = printPendings;
this.printElapsed = printElapsed;
this.printCpu = printCpu;
this.printUser = printUser;
this.printInterleavedSlots = printInterleavedSlots;
}
// ------------------------------------------------------------------------
public void printValues(PrintWriter output, String name, List<PerfStats> values) {
for(PerfStats value : values) {
printValue(output, name, value);
}
}
@Override
public void printValue(PrintWriter output, String propName, PerfStats value) {
if (printPendings) {
PendingPerfCount pendingCounts = value.getPendingCounts();
PendingPerfCountFieldValuePrinter.INSTANCE.printValue(output, propName, pendingCounts);
printSep(output);
}
final BasicTimeStatsSlotInfo[] timeStatsInfo = value.getElapsedTimeStats().getSlotInfoCopy();
final BasicTimeStatsSlotInfo[] cpuStatsInfo = value.getThreadCpuTimeStats().getSlotInfoCopy();
final BasicTimeStatsSlotInfo[] userStatsInfo = value.getThreadUserTimeStats().getSlotInfoCopy();
final int lastPrintType = (printUser)? 2: (printCpu? 1 : (printElapsed? 0 : -1));
final int lenMinus1 = timeStatsInfo.length - 1; // until len-1 to avoid trailing ", " .. then extra step
if (printInterleavedSlots) {
for (int i = 0; i < lenMinus1; i++) {
if (printElapsed) {
printNthElapsed(output, timeStatsInfo[i], i);
printSep(output);
}
if (printCpu) {
printNthCpu(output, cpuStatsInfo[i], i);
printSep(output);
}
if (printUser) {
printNthUser(output, userStatsInfo[i], i);
printSep(output);
}
}
// last loop, with trailing ", "
if (printElapsed) {
printNthElapsed(output, timeStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(0, lastPrintType, output);
}
if (printCpu) {
printNthCpu(output, cpuStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(1, lastPrintType, output);
}
if (printUser) {
printNthUser(output, userStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(2, lastPrintType, output);
}
} else {
if (printElapsed) {
for (int i = 0; i < lenMinus1; i++) {
printNthElapsed(output, timeStatsInfo[i], i);
printSep(output);
}
printNthElapsed(output, timeStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(0, lastPrintType, output);
}
if (printCpu) {
for (int i = 0; i < lenMinus1; i++) {
printNthCpu(output, cpuStatsInfo[i], i);
printSep(output);
}
printNthCpu(output, cpuStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(1, lastPrintType, output);
}
if (printUser) {
for (int i = 0; i < lenMinus1; i++) {
printNthUser(output, userStatsInfo[i], i);
printSep(output);
}
printNthUser(output, userStatsInfo[lenMinus1], lenMinus1);
printSepIfNotEq(2, lastPrintType, output);
}
}
}
private static void printSep(PrintWriter output) {
output.print(", ");
}
private static void printSepIfNotEq(int expected, int actual, PrintWriter output) {
if (expected != actual) {
output.print(", ");
}
}
private static void printNthElapsed(PrintWriter output, BasicTimeStatsSlotInfo statsInfo, int i) {
BasicTimeStatsLogHistogramFieldValuePrinter.printNth(output, statsInfo, "count", "sum", i);
}
private static void printNthUser(PrintWriter output, BasicTimeStatsSlotInfo statsInfo, int i) {
BasicTimeStatsLogHistogramFieldValuePrinter.printNth(output, statsInfo, "userCount", "userSum", i);
}
private static void printNthCpu(PrintWriter output, BasicTimeStatsSlotInfo statsInfo, int i) {
BasicTimeStatsLogHistogramFieldValuePrinter.printNth(output, statsInfo, "cpuCount", "cpuSum", i);
}
}