From 8ac1c4a0f9e3e38e8ef28164e4340c0a6009f363 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Tue, 21 Mar 2023 15:16:27 -0500 Subject: [PATCH] Copy transaction in applyTransactionOnDraw This prevents a race where the transaction is copied in the RenderThread while simultaneously applied in another thread. Bug: 273911227 Test: presubmits Change-Id: I6d5345ae0c5d998010e0d3c3f33813190b1ea8de --- core/java/android/view/ViewRootImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index d1f9fbded0031..152fa08d2a9d2 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -11365,9 +11365,13 @@ public final class ViewRootImpl implements ViewParent, if (mRemoved || !isHardwareEnabled()) { t.apply(); } else { + // Copy and clear the passed in transaction for thread safety. The new transaction is + // accessed on the render thread. + var localTransaction = new Transaction(); + localTransaction.merge(t); mHasPendingTransactions = true; registerRtFrameCallback(frame -> { - mergeWithNextTransaction(t, frame); + mergeWithNextTransaction(localTransaction, frame); }); } return true;