diff options
| author | 2023-04-05 14:23:26 +0000 | |
|---|---|---|
| committer | 2023-04-06 19:26:38 +0000 | |
| commit | dbce4f859f573df994e4f5ce10c81a2f0c880324 (patch) | |
| tree | 5985a8f0b332ec088b49ae3e8abc2269c8a9c215 | |
| parent | 5be8ccc63b2a5687479471f1941e9f95397342ae (diff) | |
Check if already on main thread when getting SSG for SCVH
SCVH can be added in process so if they are included in a SSG
the call to getSurfaceSyncGroup could run on the main thread.
If this were the case, the method would never return a value
since the call is is blocking and waiting to run on the main
thread. Instead, check if the incoming thread is the main thread
and return a value immediately instead of a post to main thread.
Change-Id: Id233eecc46afb1f5425df97986e7563e970aff12
Bug: 276356641
Test: SurfaceSyncGroupContinuousTest
| -rw-r--r-- | core/java/android/view/SurfaceControlViewHost.java | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index ac50d09cc091..cd89a561074c 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -99,9 +99,16 @@ public class SurfaceControlViewHost { @Override public ISurfaceSyncGroup getSurfaceSyncGroup() { CompletableFuture<ISurfaceSyncGroup> surfaceSyncGroup = new CompletableFuture<>(); - mViewRoot.mHandler.post( - () -> surfaceSyncGroup.complete( - mViewRoot.getOrCreateSurfaceSyncGroup().mISurfaceSyncGroup)); + // If the call came from in process and it's already running on the UI thread, return + // results immediately instead of posting to the main thread. If we post to the main + // thread, it will block itself and the return value will always be null. + if (Thread.currentThread() == mViewRoot.mThread) { + return mViewRoot.getOrCreateSurfaceSyncGroup().mISurfaceSyncGroup; + } else { + mViewRoot.mHandler.post( + () -> surfaceSyncGroup.complete( + mViewRoot.getOrCreateSurfaceSyncGroup().mISurfaceSyncGroup)); + } try { return surfaceSyncGroup.get(1, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { |