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

Commit 3c805115 authored by Kean Mariotti's avatar Kean Mariotti
Browse files

fix WM instance leaks

WindowTracingDataSource used to hold a reference to WindowTracing
that prevented WindowTracing (and in turn WindowManager)
from being garbage collected.  This CL solves the issue replacing
that reference with a WeakReference object.

Flag: android.tracing.perfetto_wm_tracing
Bug: 323165543
Test: atest com.android.server.wm.SystemServicesTestRuleTest#testRule_ranSuccessfully
Change-Id: Ib1c23fb920ae92a192ca870991778c49a148a798
parent 3ffa9b59
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.util.Log;
import android.util.proto.ProtoInputStream;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

@@ -76,15 +77,15 @@ public final class WindowTracingDataSource extends DataSource<WindowTracingDataS
    private static final String TAG = "WindowTracingDataSource";

    @NonNull
    private final Consumer<Config> mOnStartCallback;
    private final WeakReference<Consumer<Config>> mOnStartCallback;
    @NonNull
    private final Consumer<Config> mOnStopCallback;
    private final WeakReference<Consumer<Config>> mOnStopCallback;

    public WindowTracingDataSource(@NonNull Consumer<Config> onStart,
            @NonNull Consumer<Config> onStop) {
        super(DATA_SOURCE_NAME);
        mOnStartCallback = onStart;
        mOnStopCallback = onStop;
        mOnStartCallback = new WeakReference(onStart);
        mOnStopCallback = new WeakReference(onStop);

        Producer.init(InitArguments.DEFAULTS);
        DataSourceParams params =
@@ -102,12 +103,18 @@ public final class WindowTracingDataSource extends DataSource<WindowTracingDataS
        return new Instance(this, instanceIndex, config != null ? config : CONFIG_DEFAULT) {
            @Override
            protected void onStart(StartCallbackArguments args) {
                mOnStartCallback.accept(mConfig);
                Consumer<Config> callback = mOnStartCallback.get();
                if (callback != null) {
                    callback.accept(mConfig);
                }
            }

            @Override
            protected void onStop(StopCallbackArguments args) {
                mOnStopCallback.accept(mConfig);
                Consumer<Config> callback = mOnStopCallback.get();
                if (callback != null) {
                    callback.accept(mConfig);
                }
            }
        };
    }