in metrics/src/main/java/com/facebook/battery/metrics/wakelock/WakeLockMetricsCollector.java [152:180]
private synchronized void updateWakeLockCounts() {
int activeWakeLocks = 0;
long maxReleaseTimeMs = -1;
for (Iterator<WakeLockDetails> iter = mActiveWakeLockDetails.iterator(); iter.hasNext(); ) {
WakeLockDetails details = iter.next();
boolean released = details.applyAutomaticReleases();
if (details.isHeld()) {
activeWakeLocks++;
} else if (released && details.getLastReleaseTimeMs() > maxReleaseTimeMs) {
maxReleaseTimeMs = details.getLastReleaseTimeMs();
}
// Garbage collect WakeLockDetails to aggregate over the tag name instead, setting a more
// reasonable upper bound on the amount of data we keep in memory.
if (details.wakeLockReference.get() == null) {
Long existingValue = mPrevWakeLockMs.get(details.tag);
mPrevWakeLockMs.put(
details.tag, (existingValue == null ? 0 : existingValue) + details.getHeldTimeMs());
iter.remove();
}
}
if (mActiveWakeLocks != 0 && activeWakeLocks == 0) {
mWakeLocksHeldTimeMs += maxReleaseTimeMs - mWakeLockAcquireTimeMs;
}
mActiveWakeLocks = activeWakeLocks;
}