Loading core/java/android/view/ViewRootImpl.java +12 −14 Original line number Diff line number Diff line Loading @@ -888,21 +888,19 @@ public final class ViewRootImpl implements ViewParent, static BLASTBufferQueue.TransactionHangCallback sTransactionHangCallback = new BLASTBufferQueue.TransactionHangCallback() { @Override public void onTransactionHang(boolean isGPUHang) { if (isGPUHang && !sAnrReported) { public void onTransactionHang(String reason) { if (sAnrReported) { return; } sAnrReported = true; try { ActivityManager.getService().appNotResponding( "Buffer processing hung up due to stuck fence. Indicates GPU hang"); 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. } } else { // TODO: Do something with this later. For now we just ANR // in dequeue buffer later like we always have. } } }; Loading core/jni/android_graphics_BLASTBufferQueue.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -71,10 +71,12 @@ public: } } void onTransactionHang(bool isGpuHang) { void onTransactionHang(const std::string& reason) { if (mTransactionHangObject) { JNIEnv* env = getenv(mVm); ScopedLocalRef<jstring> jReason(env, env->NewStringUTF(reason.c_str())); getenv(mVm)->CallVoidMethod(mTransactionHangObject, gTransactionHangCallback.onTransactionHang, isGpuHang); gTransactionHangCallback.onTransactionHang, jReason.get()); } } Loading Loading @@ -186,9 +188,8 @@ static void nativeSetTransactionHangCallback(JNIEnv* env, jclass clazz, jlong pt } else { sp<TransactionHangCallbackWrapper> wrapper = new TransactionHangCallbackWrapper{env, transactionHangCallback}; queue->setTransactionHangCallback([wrapper](bool isGpuHang) { wrapper->onTransactionHang(isGpuHang); }); queue->setTransactionHangCallback( [wrapper](const std::string& reason) { wrapper->onTransactionHang(reason); }); } } Loading Loading @@ -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; } Loading graphics/java/android/graphics/BLASTBufferQueue.java +1 −1 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading
core/java/android/view/ViewRootImpl.java +12 −14 Original line number Diff line number Diff line Loading @@ -888,21 +888,19 @@ public final class ViewRootImpl implements ViewParent, static BLASTBufferQueue.TransactionHangCallback sTransactionHangCallback = new BLASTBufferQueue.TransactionHangCallback() { @Override public void onTransactionHang(boolean isGPUHang) { if (isGPUHang && !sAnrReported) { public void onTransactionHang(String reason) { if (sAnrReported) { return; } sAnrReported = true; try { ActivityManager.getService().appNotResponding( "Buffer processing hung up due to stuck fence. Indicates GPU hang"); 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. } } else { // TODO: Do something with this later. For now we just ANR // in dequeue buffer later like we always have. } } }; Loading
core/jni/android_graphics_BLASTBufferQueue.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -71,10 +71,12 @@ public: } } void onTransactionHang(bool isGpuHang) { void onTransactionHang(const std::string& reason) { if (mTransactionHangObject) { JNIEnv* env = getenv(mVm); ScopedLocalRef<jstring> jReason(env, env->NewStringUTF(reason.c_str())); getenv(mVm)->CallVoidMethod(mTransactionHangObject, gTransactionHangCallback.onTransactionHang, isGpuHang); gTransactionHangCallback.onTransactionHang, jReason.get()); } } Loading Loading @@ -186,9 +188,8 @@ static void nativeSetTransactionHangCallback(JNIEnv* env, jclass clazz, jlong pt } else { sp<TransactionHangCallbackWrapper> wrapper = new TransactionHangCallbackWrapper{env, transactionHangCallback}; queue->setTransactionHangCallback([wrapper](bool isGpuHang) { wrapper->onTransactionHang(isGpuHang); }); queue->setTransactionHangCallback( [wrapper](const std::string& reason) { wrapper->onTransactionHang(reason); }); } } Loading Loading @@ -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; } Loading
graphics/java/android/graphics/BLASTBufferQueue.java +1 −1 Original line number Diff line number Diff line Loading @@ -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. */ Loading