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

Commit ab71a936 authored by Andrii Kulian's avatar Andrii Kulian Committed by Android (Google) Code Review
Browse files

Merge "Fix object pool for lifecycler"

parents 550e8ec8 1c110302
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -1768,7 +1768,9 @@ public final class ActivityThread extends ClientTransactionHandler {
                            (String[]) ((SomeArgs) msg.obj).arg2);
                            (String[]) ((SomeArgs) msg.obj).arg2);
                    break;
                    break;
                case EXECUTE_TRANSACTION:
                case EXECUTE_TRANSACTION:
                    mTransactionExecutor.execute(((ClientTransaction) msg.obj));
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    mTransactionExecutor.execute(transaction);
                    transaction.recycle();
                    break;
                    break;
            }
            }
            Object obj = msg.obj;
            Object obj = msg.obj;
+5 −0
Original line number Original line Diff line number Diff line
@@ -54,6 +54,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    /** Target client activity. Might be null if the entire transaction is targeting an app. */
    /** Target client activity. Might be null if the entire transaction is targeting an app. */
    private IBinder mActivityToken;
    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.
     * Add a message to the end of the sequence of callbacks.
     * @param activityCallback A single message that can contain a lifecycle request/callback.
     * @param activityCallback A single message that can contain a lifecycle request/callback.
+13 −9
Original line number Original line Diff line number Diff line
@@ -16,8 +16,8 @@


package android.app.servertransaction;
package android.app.servertransaction;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map;


/**
/**
@@ -27,7 +27,7 @@ import java.util.Map;
class ObjectPool {
class ObjectPool {


    private static final Object sPoolSync = new Object();
    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<>();
            new HashMap<>();


    private static final int MAX_POOL_SIZE = 50;
    private static final int MAX_POOL_SIZE = 50;
@@ -40,9 +40,9 @@ class ObjectPool {
    public static <T extends ObjectPoolItem> T obtain(Class<T> itemClass) {
    public static <T extends ObjectPoolItem> T obtain(Class<T> itemClass) {
        synchronized (sPoolSync) {
        synchronized (sPoolSync) {
            @SuppressWarnings("unchecked")
            @SuppressWarnings("unchecked")
            LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(itemClass);
            final ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(itemClass);
            if (itemPool != null && !itemPool.isEmpty()) {
            if (itemPool != null && !itemPool.isEmpty()) {
                return itemPool.poll();
                return itemPool.remove(itemPool.size() - 1);
            }
            }
            return null;
            return null;
        }
        }
@@ -56,16 +56,20 @@ class ObjectPool {
    public static <T extends ObjectPoolItem> void recycle(T item) {
    public static <T extends ObjectPoolItem> void recycle(T item) {
        synchronized (sPoolSync) {
        synchronized (sPoolSync) {
            @SuppressWarnings("unchecked")
            @SuppressWarnings("unchecked")
            LinkedList<T> itemPool = (LinkedList<T>) sPoolMap.get(item.getClass());
            ArrayList<T> itemPool = (ArrayList<T>) sPoolMap.get(item.getClass());
            if (itemPool == null) {
            if (itemPool == null) {
                itemPool = new LinkedList<>();
                itemPool = new ArrayList<>();
                sPoolMap.put(item.getClass(), itemPool);
                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");
                    throw new IllegalStateException("Trying to recycle already recycled item");
                }
                }
            }


            if (itemPool.size() < MAX_POOL_SIZE) {
            if (size < MAX_POOL_SIZE) {
                itemPool.add(item);
                itemPool.add(item);
            }
            }
        }
        }
+1 −2
Original line number Original line Diff line number Diff line
@@ -42,8 +42,7 @@ import org.junit.runner.RunWith;


@RunWith(AndroidJUnit4.class)
@RunWith(AndroidJUnit4.class)
@SmallTest
@SmallTest
// TODO: b/70616950
@Presubmit
//@Presubmit
public class ObjectPoolTests {
public class ObjectPoolTests {


    // 1. Check if two obtained objects from pool are not the same.
    // 1. Check if two obtained objects from pool are not the same.
+7 −2
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.app.IApplicationThread;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.ActivityLifecycleItem;
import android.os.Binder;
import android.os.IBinder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.RemoteException;


@@ -43,8 +44,12 @@ class ClientLifecycleManager {
     */
     */
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        transaction.schedule();
        transaction.schedule();
        // TODO: b/70616950
        if (!(transaction.getClient() instanceof Binder)) {
        //transaction.recycle();
            // 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();
        }
    }
    }


    /**
    /**