private synchronized void updateWakeLockCounts()

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;
  }