package com.foursquare.heapaudit.recorders;
import com.foursquare.heapaudit.HeapQuantile;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class HeapThreadedQuantile extends HeapQuantile {
private HashMap<Long, AtomicInteger> allRegistrations = new HashMap<Long, AtomicInteger>();
private ThreadLocal<AtomicInteger> threadedRegistrations = new ThreadLocal<AtomicInteger>() {
@Override protected AtomicInteger initialValue() {
AtomicInteger counter = new AtomicInteger();
synchronized (allRegistrations) {
allRegistrations.put(Thread.currentThread().getId(),
counter);
}
return counter;
}
};
@Override public void onRegister() {
super.onRegister();
threadedRegistrations.get().incrementAndGet();
}
@Override public String summarize() {
String summary = "";
synchronized (allRegistrations) {
synchronized (registrations) {
synchronized (threadedRecords) {
for (Records records: threadedRecords) {
summary += "HEAP: " + getId() + " x" + allRegistrations.get(records.id) + " @" + records.id;
ArrayList<Stats> sQuantiles = new ArrayList<Stats>();
flatten(sQuantiles,
records.quantilesType);
flatten(sQuantiles,
records.quantilesArray);
Collections.sort(sQuantiles);
for (Stats s: sQuantiles) {
summary += "\n - " + s.toString();
}
summary += "\n";
}
}
}
}
return summary;
}
}