Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8eeac7d3 authored by Hui Yu's avatar Hui Yu
Browse files

Revert "Use ArraySet for the list of observer WeakReference."

This reverts commit 3488f1af.

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
parent 3488f1af
Loading
Loading
Loading
Loading
+19 −50
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ import android.telephony.SignalStrength;
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 @@ public class BatteryStatsImpl extends BatteryStats {
    // 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 class BatteryStatsImpl extends BatteryStats {
        }
        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))) {
           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 class BatteryStatsImpl extends BatteryStats {
        }
        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 @@ public class BatteryStatsImpl extends BatteryStats {
                    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;