Revert "Use ArraySet for the list of observer WeakReference."
This reverts commit 3488f1afcbc1f640ffcbce6cb8ef0232df54f9c7.
Reason for revert: The change to ArraySet increase system_server startup time by 20ms as reported in b/111658334. It is because add() operation into ArraySet takes much longer than ArrayList.
Change-Id: I1523332a8c9fc74cfef29b119a3c4c54d55596ec
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e12b913..6c8be14 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -64,7 +64,6 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.IntArray;
import android.util.KeyValueListParser;
import android.util.Log;
@@ -1063,34 +1062,7 @@
// methods are protected not private to be VisibleForTesting
public static class TimeBase {
- private static class ObsWeakReference extends WeakReference<TimeBaseObs> {
- public ObsWeakReference(TimeBaseObs referent) {
- super(referent);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof ObsWeakReference)) {
- return false;
- }
- return this.get() == ((ObsWeakReference)obj).get();
- }
-
- @Override
- public int hashCode() {
- TimeBaseObs obs = get();
- if (obs != null) {
- return obs.hashCode();
- } else {
- return 0;
- }
- }
- }
-
- protected final ArraySet<ObsWeakReference> mObservers = new ArraySet<>();
+ protected final ArrayList<WeakReference<TimeBaseObs>> mObservers = new ArrayList<>();
protected long mUptime;
protected long mRealtime;
@@ -1134,17 +1106,24 @@
}
public void add(TimeBaseObs observer) {
- mObservers.add(new ObsWeakReference(observer));
+ mObservers.add(new WeakReference<TimeBaseObs>(observer));
}
public void remove(TimeBaseObs observer) {
- if (!mObservers.remove(new ObsWeakReference(observer))) {
- Slog.wtf(TAG, "Removed unknown observer: " + observer);
- }
+ if (!mObservers.removeIf(ref -> ref.get() == observer)) {
+ Slog.wtf(TAG, "Removed unknown observer: " + observer);
+ }
}
public boolean hasObserver(TimeBaseObs observer) {
- return mObservers.contains(new ObsWeakReference(observer));
+ Iterator<WeakReference<TimeBaseObs>> i = mObservers.iterator();
+ while (i.hasNext()) {
+ TimeBaseObs obs = i.next().get();
+ if (obs == observer) {
+ return true;
+ }
+ }
+ return false;
}
public void init(long uptime, long realtime) {
@@ -1226,8 +1205,6 @@
}
public boolean setRunning(boolean running, long uptime, long realtime) {
- int total = mObservers.size();
- int removed = 0;
if (mRunning != running) {
mRunning = running;
if (running) {
@@ -1235,34 +1212,26 @@
mRealtimeStart = realtime;
long batteryUptime = mUnpluggedUptime = getUptime(uptime);
long batteryRealtime = mUnpluggedRealtime = getRealtime(realtime);
- for(int i = mObservers.size() - 1; i >= 0; i--) {
- final TimeBaseObs obs = mObservers.valueAt(i).get();
+ for (WeakReference<TimeBaseObs> ref : mObservers) {
+ TimeBaseObs obs = ref.get();
if (obs != null) {
obs.onTimeStarted(realtime, batteryUptime, batteryRealtime);
- } else {
- mObservers.removeAt(i);
- removed++;
}
}
} else {
mPastUptime += uptime - mUptimeStart;
mPastRealtime += realtime - mRealtimeStart;
+
long batteryUptime = getUptime(uptime);
long batteryRealtime = getRealtime(realtime);
- for(int i = mObservers.size() - 1; i >= 0; i--) {
- final TimeBaseObs obs = mObservers.valueAt(i).get();
+ for (WeakReference<TimeBaseObs> ref : mObservers) {
+ TimeBaseObs obs = ref.get();
if (obs != null) {
obs.onTimeStopped(realtime, batteryUptime, batteryRealtime);
- } else {
- mObservers.removeAt(i);
- removed++;
}
}
}
- if (DEBUG && removed != 0) {
- Slog.d(TAG,
- "TimeBase observer removed:" + removed + " from total:" + total);
- }
+ mObservers.removeIf(ref -> ref.get() == null);
return true;
}
return false;