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

Commit 6fc752c7 authored by Hui Yu's avatar Hui Yu
Browse files

Revert "Fix the memory leak in BatteryStatsImpl.Timebase.mObservers."

This reverts commit 420ed9ef.

Reason for revert: The WeakReference change can prevent memory leak, but 
but the extra time spend on creating thousands of WeakReference objects has slowed down system_server startup as reported by b/111658334. Revert this CL for now, will find other approach to prevent memory leak. 

Change-Id: I07a5806e36159467459b841f63e2b0c55b6cc10b
parent 38bd60a7
Loading
Loading
Loading
Loading
+12 −25
Original line number Diff line number Diff line
@@ -106,7 +106,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -1062,7 +1061,7 @@ public class BatteryStatsImpl extends BatteryStats {
    // methods are protected not private to be VisibleForTesting
    public static class TimeBase {
        protected final ArrayList<WeakReference<TimeBaseObs>> mObservers = new ArrayList<>();
        protected final ArrayList<TimeBaseObs> mObservers = new ArrayList<>();
        protected long mUptime;
        protected long mRealtime;
@@ -1106,24 +1105,17 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        public void add(TimeBaseObs observer) {
            mObservers.add(new WeakReference<TimeBaseObs>(observer));
            mObservers.add(observer);
        }
        public void remove(TimeBaseObs observer) {
           if (!mObservers.removeIf(ref -> ref.get() == observer)) {
            if (!mObservers.remove(observer)) {
                Slog.wtf(TAG, "Removed unknown observer: " + observer);
            }
        }
        public boolean hasObserver(TimeBaseObs observer) {
            Iterator<WeakReference<TimeBaseObs>> i = mObservers.iterator();
            while (i.hasNext()) {
                TimeBaseObs obs = i.next().get();
                if (obs == observer) {
                    return true;
                }
            }
            return false;
            return mObservers.contains(observer);
        }
        public void init(long uptime, long realtime) {
@@ -1212,11 +1204,9 @@ public class BatteryStatsImpl extends BatteryStats {
                    mRealtimeStart = realtime;
                    long batteryUptime = mUnpluggedUptime = getUptime(uptime);
                    long batteryRealtime = mUnpluggedRealtime = getRealtime(realtime);
                    for (WeakReference<TimeBaseObs> ref : mObservers) {
                        TimeBaseObs obs = ref.get();
                        if (obs != null) {
                            obs.onTimeStarted(realtime, batteryUptime, batteryRealtime);
                        }
                    for (int i = mObservers.size() - 1; i >= 0; i--) {
                        mObservers.get(i).onTimeStarted(realtime, batteryUptime, batteryRealtime);
                    }
                } else {
                    mPastUptime += uptime - mUptimeStart;
@@ -1224,14 +1214,11 @@ public class BatteryStatsImpl extends BatteryStats {
                    long batteryUptime = getUptime(uptime);
                    long batteryRealtime = getRealtime(realtime);
                    for (WeakReference<TimeBaseObs> ref : mObservers) {
                        TimeBaseObs obs = ref.get();
                        if (obs != null) {
                            obs.onTimeStopped(realtime, batteryUptime, batteryRealtime);
                        }
                    for (int i = mObservers.size() - 1; i >= 0; i--) {
                        mObservers.get(i).onTimeStopped(realtime, batteryUptime, batteryRealtime);
                    }
                }
                mObservers.removeIf(ref -> ref.get() == null);
                return true;
            }
            return false;