From ee41d4afcb089eac6a6a569557905f71bdd33f6c Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Mon, 21 Nov 2016 08:41:10 -0800 Subject: [PATCH] Introduced WindowContainer.mConsumerWrapperPool WindowContainer.forAllWindows(Consumer...) requires a lambda to be allocated each time it is called since we need to capture the callback. Switched to using an object pool for the process to reduce allocations. Test: Run the allocation traker and make sure there aren't lambda allocations for WindowContainer.forAllWindows() method. Change-Id: If49c1b0bd2e0a5d6d7a30ff686b5235e69a61750 --- .../android/server/wm/WindowContainer.java | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index f5db0b668c225..03769e97a27f0 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -18,6 +18,8 @@ package com.android.server.wm; import android.annotation.CallSuper; import android.content.res.Configuration; +import android.util.Pools; + import com.android.internal.util.ToBooleanFunction; import java.util.Comparator; @@ -68,6 +70,9 @@ class WindowContainer implements Comparable mConsumerWrapperPool = + new Pools.SynchronizedPool<>(3); + final protected WindowContainer getParent() { return mParent; } @@ -517,10 +522,9 @@ class WindowContainer implements Comparable callback, boolean traverseTopToBottom) { - forAllWindows(w -> { - callback.accept(w); - return false; - }, traverseTopToBottom); + ForAllWindowsConsumerWrapper wrapper = obtainConsumerWrapper(callback); + forAllWindows(wrapper, traverseTopToBottom); + wrapper.release(); } WindowState getWindow(Predicate callback) { @@ -613,4 +617,32 @@ class WindowContainer implements Comparable consumer) { + ForAllWindowsConsumerWrapper wrapper = mConsumerWrapperPool.acquire(); + if (wrapper == null) { + wrapper = new ForAllWindowsConsumerWrapper(); + } + wrapper.setConsumer(consumer); + return wrapper; + } + + private final class ForAllWindowsConsumerWrapper implements ToBooleanFunction { + + private Consumer mConsumer; + + void setConsumer(Consumer consumer) { + mConsumer = consumer; + } + + @Override + public boolean apply(WindowState w) { + mConsumer.accept(w); + return false; + } + + void release() { + mConsumer = null; + mConsumerWrapperPool.release(this); + } + } }