diff options
| author | 2024-08-23 11:44:47 +0000 | |
|---|---|---|
| committer | 2024-08-23 11:59:06 +0000 | |
| commit | 1575f70ea53cd5e06295afa79184f9e5de70fb0f (patch) | |
| tree | d424b1554b330b1220b898fac4f8a56333782b56 | |
| parent | 3c805115ec0b44703b6a5960d05fde5376cb353a (diff) | |
fix WM instance leaks
Somehow weak references to WindowTracingPerfetto's methods become null,
even though WindowTracingPerfetto is not garbage collected.
Directly referencing (weakly) WindowTracingPerfetto,
instead of its methods, solves the issue.
Flag: android.tracing.perfetto_wm_tracing
Bug: 323165543
Test: presubmit
Change-Id: I73eb10b76d7e6ab3666ac977159d04ad0b38fd17
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowTracingDataSource.java | 23 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowTracingPerfetto.java | 7 |
2 files changed, 12 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/wm/WindowTracingDataSource.java b/services/core/java/com/android/server/wm/WindowTracingDataSource.java index 2c5a4538863e..73ecbb47f0d2 100644 --- a/services/core/java/com/android/server/wm/WindowTracingDataSource.java +++ b/services/core/java/com/android/server/wm/WindowTracingDataSource.java @@ -35,7 +35,6 @@ 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; public final class WindowTracingDataSource extends DataSource<WindowTracingDataSource.Instance, WindowTracingDataSource.TlsState, Void> { @@ -77,15 +76,11 @@ public final class WindowTracingDataSource extends DataSource<WindowTracingDataS private static final String TAG = "WindowTracingDataSource"; @NonNull - private final WeakReference<Consumer<Config>> mOnStartCallback; - @NonNull - private final WeakReference<Consumer<Config>> mOnStopCallback; + private final WeakReference<WindowTracingPerfetto> mWindowTracing; - public WindowTracingDataSource(@NonNull Consumer<Config> onStart, - @NonNull Consumer<Config> onStop) { + public WindowTracingDataSource(WindowTracingPerfetto windowTracing) { super(DATA_SOURCE_NAME); - mOnStartCallback = new WeakReference(onStart); - mOnStopCallback = new WeakReference(onStop); + mWindowTracing = new WeakReference<>(windowTracing); Producer.init(InitArguments.DEFAULTS); DataSourceParams params = @@ -103,17 +98,17 @@ public final class WindowTracingDataSource extends DataSource<WindowTracingDataS return new Instance(this, instanceIndex, config != null ? config : CONFIG_DEFAULT) { @Override protected void onStart(StartCallbackArguments args) { - Consumer<Config> callback = mOnStartCallback.get(); - if (callback != null) { - callback.accept(mConfig); + WindowTracingPerfetto windowTracing = mWindowTracing.get(); + if (windowTracing != null) { + windowTracing.onStart(mConfig); } } @Override protected void onStop(StopCallbackArguments args) { - Consumer<Config> callback = mOnStopCallback.get(); - if (callback != null) { - callback.accept(mConfig); + WindowTracingPerfetto windowTracing = mWindowTracing.get(); + if (windowTracing != null) { + windowTracing.onStop(mConfig); } } }; diff --git a/services/core/java/com/android/server/wm/WindowTracingPerfetto.java b/services/core/java/com/android/server/wm/WindowTracingPerfetto.java index cf948ca76f99..22d6c863fd4f 100644 --- a/services/core/java/com/android/server/wm/WindowTracingPerfetto.java +++ b/services/core/java/com/android/server/wm/WindowTracingPerfetto.java @@ -35,8 +35,7 @@ class WindowTracingPerfetto extends WindowTracing { private final AtomicInteger mCountSessionsOnFrame = new AtomicInteger(); private final AtomicInteger mCountSessionsOnTransaction = new AtomicInteger(); - private final WindowTracingDataSource mDataSource = new WindowTracingDataSource( - this::onStart, this::onStop); + private final WindowTracingDataSource mDataSource = new WindowTracingDataSource(this); WindowTracingPerfetto(WindowManagerService service, Choreographer choreographer) { this(service, choreographer, service.mGlobalLock); @@ -156,7 +155,7 @@ class WindowTracingPerfetto extends WindowTracing { return mCountSessionsOnTransaction.get() > 0; } - private void onStart(WindowTracingDataSource.Config config) { + void onStart(WindowTracingDataSource.Config config) { if (config.mLogFrequency == WindowTracingLogFrequency.FRAME) { mCountSessionsOnFrame.incrementAndGet(); } else if (config.mLogFrequency == WindowTracingLogFrequency.TRANSACTION) { @@ -168,7 +167,7 @@ class WindowTracingPerfetto extends WindowTracing { log(WHERE_START_TRACING); } - private void onStop(WindowTracingDataSource.Config config) { + void onStop(WindowTracingDataSource.Config config) { if (config.mLogFrequency == WindowTracingLogFrequency.FRAME) { mCountSessionsOnFrame.decrementAndGet(); } else if (config.mLogFrequency == WindowTracingLogFrequency.TRANSACTION) { |