From 3bb9f289f2dd5885d5fa926186c9f50d665813f3 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Mon, 17 Oct 2022 20:05:31 +0000 Subject: [PATCH] BBQ: Update TransactionHangCallback to pass ANR reason Bug: 244218818 Test: presubmits Change-Id: I00f961c743665b1a38fe3a9e66935b11570bc3e4 --- core/java/android/view/ViewRootImpl.java | 26 +++++++++---------- .../jni/android_graphics_BLASTBufferQueue.cpp | 16 +++++++----- .../android/graphics/BLASTBufferQueue.java | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index bfa13507ed506..efda257aed27f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -888,20 +888,18 @@ public final class ViewRootImpl implements ViewParent, static BLASTBufferQueue.TransactionHangCallback sTransactionHangCallback = new BLASTBufferQueue.TransactionHangCallback() { @Override - public void onTransactionHang(boolean isGPUHang) { - if (isGPUHang && !sAnrReported) { - sAnrReported = true; - try { - ActivityManager.getService().appNotResponding( - "Buffer processing hung up due to stuck fence. Indicates GPU hang"); - } catch (RemoteException e) { - // We asked the system to crash us, but the system - // already crashed. Unfortunately things may be - // out of control. - } - } else { - // TODO: Do something with this later. For now we just ANR - // in dequeue buffer later like we always have. + public void onTransactionHang(String reason) { + if (sAnrReported) { + return; + } + + sAnrReported = true; + try { + ActivityManager.getService().appNotResponding(reason); + } catch (RemoteException e) { + // We asked the system to crash us, but the system + // already crashed. Unfortunately things may be + // out of control. } } }; diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index 1520ea5c6831f..03815108f6dd4 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -71,10 +71,12 @@ public: } } - void onTransactionHang(bool isGpuHang) { + void onTransactionHang(const std::string& reason) { if (mTransactionHangObject) { + JNIEnv* env = getenv(mVm); + ScopedLocalRef jReason(env, env->NewStringUTF(reason.c_str())); getenv(mVm)->CallVoidMethod(mTransactionHangObject, - gTransactionHangCallback.onTransactionHang, isGpuHang); + gTransactionHangCallback.onTransactionHang, jReason.get()); } } @@ -177,7 +179,7 @@ static bool nativeIsSameSurfaceControl(JNIEnv* env, jclass clazz, jlong ptr, jlo sp queue = reinterpret_cast(ptr); return queue->isSameSurfaceControl(reinterpret_cast(surfaceControl)); } - + static void nativeSetTransactionHangCallback(JNIEnv* env, jclass clazz, jlong ptr, jobject transactionHangCallback) { sp queue = reinterpret_cast(ptr); @@ -186,9 +188,8 @@ static void nativeSetTransactionHangCallback(JNIEnv* env, jclass clazz, jlong pt } else { sp wrapper = new TransactionHangCallbackWrapper{env, transactionHangCallback}; - queue->setTransactionHangCallback([wrapper](bool isGpuHang) { - wrapper->onTransactionHang(isGpuHang); - }); + queue->setTransactionHangCallback( + [wrapper](const std::string& reason) { wrapper->onTransactionHang(reason); }); } } @@ -236,7 +237,8 @@ int register_android_graphics_BLASTBufferQueue(JNIEnv* env) { jclass transactionHangClass = FindClassOrDie(env, "android/graphics/BLASTBufferQueue$TransactionHangCallback"); gTransactionHangCallback.onTransactionHang = - GetMethodIDOrDie(env, transactionHangClass, "onTransactionHang", "(Z)V"); + GetMethodIDOrDie(env, transactionHangClass, "onTransactionHang", + "(Ljava/lang/String;)V"); return 0; } diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java index 1c41d06a3da20..9940ca3933c8f 100644 --- a/graphics/java/android/graphics/BLASTBufferQueue.java +++ b/graphics/java/android/graphics/BLASTBufferQueue.java @@ -47,7 +47,7 @@ public final class BLASTBufferQueue { TransactionHangCallback callback); public interface TransactionHangCallback { - void onTransactionHang(boolean isGpuHang); + void onTransactionHang(String reason); } /** Create a new connection with the surface flinger. */