From 80b12fcaaec458377d966803c3a61504f0897ea1 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Wed, 29 May 2013 15:54:25 -0700 Subject: [PATCH] Disable the AssetAtlas when running under valgrind Bug #9191438 When running under valgrind, the ppid will be different from the ppid of the system server (which always gets forked from zygote.) Change-Id: I42cbf99fd0084aeab76c30de9beb7c49ed1fc7d8 --- core/java/android/os/Process.java | 6 ++++++ core/java/android/view/HardwareRenderer.java | 12 +++++++----- core/java/android/view/IAssetAtlas.aidl | 7 +++++++ core/jni/android_util_Process.cpp | 6 ++++++ .../java/com/android/server/AssetAtlasService.java | 5 +++++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 476b4ea8d8cfe..93b12553f11ef 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -649,6 +649,12 @@ public class Process { */ public static final native int myPid(); + /** + * Returns the identifier of this process' parent. + * @hide + */ + public static native int myPpid(); + /** * Returns the identifier of the calling thread, which be used with * {@link #setThreadPriority(int, int)}. diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 8dada90d21506..c07b187708995 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -1931,11 +1931,13 @@ public abstract class HardwareRenderer { IAssetAtlas atlas = IAssetAtlas.Stub.asInterface(binder); try { - GraphicBuffer buffer = atlas.getBuffer(); - if (buffer != null) { - int[] map = atlas.getMap(); - if (map != null) { - GLES20Canvas.initAtlas(buffer, map); + if (atlas.isCompatible(android.os.Process.myPpid())) { + GraphicBuffer buffer = atlas.getBuffer(); + if (buffer != null) { + int[] map = atlas.getMap(); + if (map != null) { + GLES20Canvas.initAtlas(buffer, map); + } } } } catch (RemoteException e) { diff --git a/core/java/android/view/IAssetAtlas.aidl b/core/java/android/view/IAssetAtlas.aidl index 2595179c851a1..5f1e238923edb 100644 --- a/core/java/android/view/IAssetAtlas.aidl +++ b/core/java/android/view/IAssetAtlas.aidl @@ -27,6 +27,13 @@ import android.view.GraphicBuffer; * @hide */ interface IAssetAtlas { + /** + * Indicates whether the atlas is compatible with the specified + * parent process id. If the atlas' ppid does not match, this + * method will return false. + */ + boolean isCompatible(int ppid); + /** * Returns the atlas buffer (texture) or null if the atlas is * not available yet. diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 5d323285662d9..61eb31bf29ce4 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -99,6 +99,11 @@ jint android_os_Process_myPid(JNIEnv* env, jobject clazz) return getpid(); } +jint android_os_Process_myPpid(JNIEnv* env, jobject clazz) +{ + return getppid(); +} + jint android_os_Process_myUid(JNIEnv* env, jobject clazz) { return getuid(); @@ -990,6 +995,7 @@ jintArray android_os_Process_getPidsForCommands(JNIEnv* env, jobject clazz, static const JNINativeMethod methods[] = { {"myPid", "()I", (void*)android_os_Process_myPid}, + {"myPpid", "()I", (void*)android_os_Process_myPpid}, {"myTid", "()I", (void*)android_os_Process_myTid}, {"myUid", "()I", (void*)android_os_Process_myUid}, {"getUidForName", "(Ljava/lang/String;)I", (void*)android_os_Process_getUidForName}, diff --git a/services/java/com/android/server/AssetAtlasService.java b/services/java/com/android/server/AssetAtlasService.java index b18be1cb1780a..33f082c00464c 100644 --- a/services/java/com/android/server/AssetAtlasService.java +++ b/services/java/com/android/server/AssetAtlasService.java @@ -369,6 +369,11 @@ public class AssetAtlasService extends IAssetAtlas.Stub { private static native void nReleaseAtlasCanvas(Canvas canvas, int bitmap); private static native boolean nUploadAtlas(GraphicBuffer buffer, int bitmap); + @Override + public boolean isCompatible(int ppid) { + return ppid == android.os.Process.myPpid(); + } + @Override public GraphicBuffer getBuffer() throws RemoteException { return mAtlasReady.get() ? mBuffer : null;