Loading core/java/android/app/ActivityThread.java +3 −1 Original line number Diff line number Diff line Loading @@ -1768,7 +1768,9 @@ public final class ActivityThread extends ClientTransactionHandler { (String[]) ((SomeArgs) msg.obj).arg2); break; case EXECUTE_TRANSACTION: mTransactionExecutor.execute(((ClientTransaction) msg.obj)); final ClientTransaction transaction = (ClientTransaction) msg.obj; mTransactionExecutor.execute(transaction); transaction.recycle(); break; } Object obj = msg.obj; Loading core/java/android/app/servertransaction/ClientTransaction.java +5 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { /** Target client activity. Might be null if the entire transaction is targeting an app. */ private IBinder mActivityToken; /** Get the target client of the transaction. */ public IApplicationThread getClient() { return mClient; } /** * Add a message to the end of the sequence of callbacks. * @param activityCallback A single message that can contain a lifecycle request/callback. Loading core/java/android/app/servertransaction/ObjectPool.java +13 −9 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package android.app.servertransaction; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /** Loading @@ -27,7 +27,7 @@ import java.util.Map; class ObjectPool { private static final Object sPoolSync = new Object(); private static final Map<Class, LinkedList<? extends ObjectPoolItem>> sPoolMap = private static final Map<Class, ArrayList<? extends ObjectPoolItem>> sPoolMap = new HashMap<>(); private static final int MAX_POOL_SIZE = 50; Loading @@ -40,9 +40,9 @@ class ObjectPool { public static <T extends ObjectPoolItem> T obtain(Class<T> itemClass) { synchronized (sPoolSync) { @SuppressWarnings("unchecked") LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(itemClass); final ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(itemClass); if (itemPool != null && !itemPool.isEmpty()) { return itemPool.poll(); return itemPool.remove(itemPool.size() - 1); } return null; } Loading @@ -56,16 +56,20 @@ class ObjectPool { public static <T extends ObjectPoolItem> void recycle(T item) { synchronized (sPoolSync) { @SuppressWarnings("unchecked") LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(item.getClass()); ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(item.getClass()); if (itemPool == null) { itemPool = new LinkedList<>(); itemPool = new ArrayList<>(); sPoolMap.put(item.getClass(), itemPool); } if (itemPool.contains(item)) { // Check if the item is already in the pool final int size = itemPool.size(); for (int i = 0; i < size; i++) { if (itemPool.get(i) == item) { throw new IllegalStateException("Trying to recycle already recycled item"); } } if (itemPool.size() < MAX_POOL_SIZE) { if (size < MAX_POOL_SIZE) { itemPool.add(item); } } Loading core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +1 −2 Original line number Diff line number Diff line Loading @@ -42,8 +42,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest // TODO: b/70616950 //@Presubmit @Presubmit public class ObjectPoolTests { // 1. Check if two obtained objects from pool are not the same. Loading services/core/java/com/android/server/am/ClientLifecycleManager.java +7 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.app.IApplicationThread; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ActivityLifecycleItem; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; Loading @@ -43,8 +44,12 @@ class ClientLifecycleManager { */ void scheduleTransaction(ClientTransaction transaction) throws RemoteException { transaction.schedule(); // TODO: b/70616950 //transaction.recycle(); if (!(transaction.getClient() instanceof Binder)) { // If client is not an instance of Binder - it's a remote call and at this point it is // safe to recycle the object. All objects used for local calls will be recycled after // the transaction is executed on client in ActivityThread. transaction.recycle(); } } /** Loading Loading
core/java/android/app/ActivityThread.java +3 −1 Original line number Diff line number Diff line Loading @@ -1768,7 +1768,9 @@ public final class ActivityThread extends ClientTransactionHandler { (String[]) ((SomeArgs) msg.obj).arg2); break; case EXECUTE_TRANSACTION: mTransactionExecutor.execute(((ClientTransaction) msg.obj)); final ClientTransaction transaction = (ClientTransaction) msg.obj; mTransactionExecutor.execute(transaction); transaction.recycle(); break; } Object obj = msg.obj; Loading
core/java/android/app/servertransaction/ClientTransaction.java +5 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { /** Target client activity. Might be null if the entire transaction is targeting an app. */ private IBinder mActivityToken; /** Get the target client of the transaction. */ public IApplicationThread getClient() { return mClient; } /** * Add a message to the end of the sequence of callbacks. * @param activityCallback A single message that can contain a lifecycle request/callback. Loading
core/java/android/app/servertransaction/ObjectPool.java +13 −9 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package android.app.servertransaction; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; /** Loading @@ -27,7 +27,7 @@ import java.util.Map; class ObjectPool { private static final Object sPoolSync = new Object(); private static final Map<Class, LinkedList<? extends ObjectPoolItem>> sPoolMap = private static final Map<Class, ArrayList<? extends ObjectPoolItem>> sPoolMap = new HashMap<>(); private static final int MAX_POOL_SIZE = 50; Loading @@ -40,9 +40,9 @@ class ObjectPool { public static <T extends ObjectPoolItem> T obtain(Class<T> itemClass) { synchronized (sPoolSync) { @SuppressWarnings("unchecked") LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(itemClass); final ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(itemClass); if (itemPool != null && !itemPool.isEmpty()) { return itemPool.poll(); return itemPool.remove(itemPool.size() - 1); } return null; } Loading @@ -56,16 +56,20 @@ class ObjectPool { public static <T extends ObjectPoolItem> void recycle(T item) { synchronized (sPoolSync) { @SuppressWarnings("unchecked") LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(item.getClass()); ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(item.getClass()); if (itemPool == null) { itemPool = new LinkedList<>(); itemPool = new ArrayList<>(); sPoolMap.put(item.getClass(), itemPool); } if (itemPool.contains(item)) { // Check if the item is already in the pool final int size = itemPool.size(); for (int i = 0; i < size; i++) { if (itemPool.get(i) == item) { throw new IllegalStateException("Trying to recycle already recycled item"); } } if (itemPool.size() < MAX_POOL_SIZE) { if (size < MAX_POOL_SIZE) { itemPool.add(item); } } Loading
core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +1 −2 Original line number Diff line number Diff line Loading @@ -42,8 +42,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest // TODO: b/70616950 //@Presubmit @Presubmit public class ObjectPoolTests { // 1. Check if two obtained objects from pool are not the same. Loading
services/core/java/com/android/server/am/ClientLifecycleManager.java +7 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.app.IApplicationThread; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ActivityLifecycleItem; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; Loading @@ -43,8 +44,12 @@ class ClientLifecycleManager { */ void scheduleTransaction(ClientTransaction transaction) throws RemoteException { transaction.schedule(); // TODO: b/70616950 //transaction.recycle(); if (!(transaction.getClient() instanceof Binder)) { // If client is not an instance of Binder - it's a remote call and at this point it is // safe to recycle the object. All objects used for local calls will be recycled after // the transaction is executed on client in ActivityThread. transaction.recycle(); } } /** Loading