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

Commit 5da6bcae authored by wilsonshih's avatar wilsonshih
Browse files

Initialize reference count for SnapshotTracker

Because there can be more than one onTaskSnapshotChanged listeners in
a process, initialize the reference count based on the listener size
for SnapshotTracker, to prevent one thread closing the snapshot while
others are still using it.
Also remove the extra close buffer request when
TaskStackChangeListeners#impl handle ON_TASK_SNAPSHOT_CHANGED,
ThumbnailData#fromSnapshot will do close buffer already.

Flag: com.android.window.flags.reduce_task_snapshot_memory_usage
Bug: 438037933
Test: monitor the same snapshot object will only request to close
buffer once from other tests after SystemUITests:NavigationBarTest

Change-Id: I31e94bf377b4dab998691ee962172dcee082b956
parent 38b97132
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -58,11 +58,15 @@ class TaskSnapshotListenerTracker extends ITaskSnapshotListener.Stub {
     */
    @Override
    public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) {
        mManager.createTracker(taskId, snapshot);
        final ArrayList<TaskSnapshotListener> tempList;
        synchronized (mLocalListeners) {
            if (isEmpty()) {
                snapshot.closeBuffer();
                return;
            }
            tempList = new ArrayList<>(mLocalListeners);
        }
        mManager.createTrackerWithCount(taskId, snapshot, tempList.size());
        for (TaskSnapshotListener l : tempList) {
            l.onTaskSnapshotChanged(taskId, snapshot);
        }
+11 −6
Original line number Diff line number Diff line
@@ -264,9 +264,9 @@ public class TaskSnapshotManager {
        }
    }

    void createTracker(int taskId, TaskSnapshot snapshot) {
    void createTrackerWithCount(int taskId, TaskSnapshot snapshot, int initialReferenceCount) {
        synchronized (sLock) {
            mGlobalSnapshotTracker.createTracker(taskId, snapshot);
            mGlobalSnapshotTracker.createTracker(taskId, snapshot, initialReferenceCount);
        }
    }

@@ -296,13 +296,14 @@ public class TaskSnapshotManager {
    private static class GlobalSnapshotTracker {
        final SparseArray<SingleTaskTracker> mSnapshotTrackers = new SparseArray<>();

        void createTracker(int taskId, TaskSnapshot snapshot) {
        void createTracker(int taskId, TaskSnapshot snapshot, int initialReferenceCount) {
            SingleTaskTracker taskTracker = mSnapshotTrackers.get(taskId);
            if (taskTracker == null) {
                taskTracker = new SingleTaskTracker();
                mSnapshotTrackers.put(taskId, taskTracker);
            }
            final SnapshotTracker tracker = new SnapshotTracker(taskId, snapshot);
            final SnapshotTracker tracker = new SnapshotTracker(taskId, snapshot,
                    initialReferenceCount);
            taskTracker.addTracker(tracker);
            sCleaner.register(snapshot, () -> {
                synchronized (sLock) {
@@ -311,6 +312,10 @@ public class TaskSnapshotManager {
            });
        }

        void createTracker(int taskId, TaskSnapshot snapshot) {
            createTracker(taskId, snapshot, 1 /* initialReferenceCount */);
        }

        void removeTracker(SnapshotTracker tracker, boolean forceRemove) {
            if (tracker == null) {
                return;
@@ -443,7 +448,7 @@ public class TaskSnapshotManager {
        final WeakReference<TaskSnapshot> mSnapshot;
        int mReferenceCount;

        SnapshotTracker(int taskId, TaskSnapshot snapshot) {
        SnapshotTracker(int taskId, TaskSnapshot snapshot, int referenceCount) {
            super();
            mTaskId = taskId;
            mSnapshotId = snapshot.getId();
@@ -451,7 +456,7 @@ public class TaskSnapshotManager {
            mIsLowResolution = snapshot.isLowResolution();
            snapshot.setSnapshotTracker(this);
            mSnapshot = new WeakReference<>(snapshot);
            mReferenceCount = 1;
            mReferenceCount = referenceCount;
        }
        void increaseReference() {
            mReferenceCount++;
+2 −3
Original line number Diff line number Diff line
@@ -391,9 +391,8 @@ public class TaskStackChangeListeners {
                        }
                        if (!snapshotConsumed) {
                            thumbnail.recycleBitmap();
                            if (com.android.window.flags.Flags.reduceTaskSnapshotMemoryUsage()) {
                                snapshot.closeBuffer();
                            } else if (snapshot.getHardwareBuffer() != null) {
                            if (!com.android.window.flags.Flags.reduceTaskSnapshotMemoryUsage()
                                    && snapshot.getHardwareBuffer() != null) {
                                snapshot.getHardwareBuffer().close();
                            }
                        }