Loading core/java/android/app/ActivityManagerNative.java +21 −1 Original line number Diff line number Diff line Loading @@ -3003,6 +3003,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } case SET_RENDER_THREAD_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final int tid = data.readInt(); setRenderThread(tid); reply.writeNoException(); return true; } } return super.onTransact(code, data, reply, flags); Loading Loading @@ -7052,5 +7059,18 @@ class ActivityManagerProxy implements IActivityManager return; } public void setRenderThread(int tid) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeInt(tid); mRemote.transact(SET_RENDER_THREAD_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); return; } private IBinder mRemote; } core/java/android/app/IActivityManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -659,6 +659,7 @@ public interface IActivityManager extends IInterface { throws RemoteException; public void setVrThread(int tid) throws RemoteException; public void setRenderThread(int tid) throws RemoteException; /* * Private non-Binder interfaces Loading Loading @@ -1046,5 +1047,8 @@ public interface IActivityManager extends IInterface { int START_CONFIRM_DEVICE_CREDENTIAL_INTENT = IBinder.FIRST_CALL_TRANSACTION + 374; int SEND_IDLE_JOB_TRIGGER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 375; int SEND_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 376; // Start of N MR1 transactions int SET_VR_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 377; int SET_RENDER_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 378; } core/java/android/os/Process.java +19 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.os; import android.system.Os; import android.system.OsConstants; import android.util.Log; import dalvik.system.VMRuntime; Loading Loading @@ -303,7 +304,6 @@ public class Process { */ public static final int SCHED_RESET_ON_FORK = 0x40000000; // Keep in sync with SP_* constants of enum type SchedPolicy // declared in system/core/include/cutils/sched_policy.h, // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value. Loading Loading @@ -899,4 +899,22 @@ public class Process { * @hide */ public static final native void removeAllProcessGroups(); /** * Check to see if a thread belongs to a given process. This may require * more permissions than apps generally have. * @return true if this thread belongs to a process * @hide */ public static final boolean isThreadInProcess(int tid, int pid) { try { if (Os.access("/proc/" + tid + "/task/" + pid, OsConstants.F_OK)) { return true; } else { return false; } } catch (Exception e) { return false; } } } core/java/android/view/ThreadedRenderer.java +12 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.app.ActivityManagerNative; import android.annotation.IntDef; import android.annotation.NonNull; import android.content.Context; Loading Loading @@ -917,10 +918,20 @@ public final class ThreadedRenderer { synchronized void init(Context context, long renderProxy) { if (mInitialized) return; mInitialized = true; initSched(context, renderProxy); initGraphicsStats(context, renderProxy); initAssetAtlas(context, renderProxy); } private static void initSched(Context context, long renderProxy) { try { int tid = nGetRenderThreadTid(renderProxy); ActivityManagerNative.getDefault().setRenderThread(tid); } catch (Throwable t) { Log.w(LOG_TAG, "Failed to set scheduler for RenderThread", t); } } private static void initGraphicsStats(Context context, long renderProxy) { try { IBinder binder = ServiceManager.getService("graphicsstats"); Loading Loading @@ -979,6 +990,7 @@ public final class ThreadedRenderer { private static native void nSetAtlas(long nativeProxy, GraphicBuffer buffer, long[] map); private static native void nSetProcessStatsBuffer(long nativeProxy, int fd); private static native int nGetRenderThreadTid(long nativeProxy); private static native long nCreateRootRenderNode(); private static native long nCreateProxy(boolean translucent, long rootRenderNode); Loading core/jni/android_view_ThreadedRenderer.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -554,6 +554,12 @@ static void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, job proxy->setProcessStatsBuffer(fd); } static jint android_view_ThreadedRenderer_getRenderThreadTid(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); return proxy->getRenderThreadTid(); } static jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { RootRenderNode* node = new RootRenderNode(env); node->incStrong(0); Loading Loading @@ -870,6 +876,7 @@ static const JNINativeMethod gMethods[] = { { "nSupportsOpenGL", "!()Z", (void*) android_view_ThreadedRenderer_supportsOpenGL }, { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer }, { "nGetRenderThreadTid", "(J)I", (void*) android_view_ThreadedRenderer_getRenderThreadTid }, { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, Loading Loading
core/java/android/app/ActivityManagerNative.java +21 −1 Original line number Diff line number Diff line Loading @@ -3003,6 +3003,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } case SET_RENDER_THREAD_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final int tid = data.readInt(); setRenderThread(tid); reply.writeNoException(); return true; } } return super.onTransact(code, data, reply, flags); Loading Loading @@ -7052,5 +7059,18 @@ class ActivityManagerProxy implements IActivityManager return; } public void setRenderThread(int tid) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeInt(tid); mRemote.transact(SET_RENDER_THREAD_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); return; } private IBinder mRemote; }
core/java/android/app/IActivityManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -659,6 +659,7 @@ public interface IActivityManager extends IInterface { throws RemoteException; public void setVrThread(int tid) throws RemoteException; public void setRenderThread(int tid) throws RemoteException; /* * Private non-Binder interfaces Loading Loading @@ -1046,5 +1047,8 @@ public interface IActivityManager extends IInterface { int START_CONFIRM_DEVICE_CREDENTIAL_INTENT = IBinder.FIRST_CALL_TRANSACTION + 374; int SEND_IDLE_JOB_TRIGGER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 375; int SEND_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 376; // Start of N MR1 transactions int SET_VR_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 377; int SET_RENDER_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 378; }
core/java/android/os/Process.java +19 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.os; import android.system.Os; import android.system.OsConstants; import android.util.Log; import dalvik.system.VMRuntime; Loading Loading @@ -303,7 +304,6 @@ public class Process { */ public static final int SCHED_RESET_ON_FORK = 0x40000000; // Keep in sync with SP_* constants of enum type SchedPolicy // declared in system/core/include/cutils/sched_policy.h, // except THREAD_GROUP_DEFAULT does not correspond to any SP_* value. Loading Loading @@ -899,4 +899,22 @@ public class Process { * @hide */ public static final native void removeAllProcessGroups(); /** * Check to see if a thread belongs to a given process. This may require * more permissions than apps generally have. * @return true if this thread belongs to a process * @hide */ public static final boolean isThreadInProcess(int tid, int pid) { try { if (Os.access("/proc/" + tid + "/task/" + pid, OsConstants.F_OK)) { return true; } else { return false; } } catch (Exception e) { return false; } } }
core/java/android/view/ThreadedRenderer.java +12 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.app.ActivityManagerNative; import android.annotation.IntDef; import android.annotation.NonNull; import android.content.Context; Loading Loading @@ -917,10 +918,20 @@ public final class ThreadedRenderer { synchronized void init(Context context, long renderProxy) { if (mInitialized) return; mInitialized = true; initSched(context, renderProxy); initGraphicsStats(context, renderProxy); initAssetAtlas(context, renderProxy); } private static void initSched(Context context, long renderProxy) { try { int tid = nGetRenderThreadTid(renderProxy); ActivityManagerNative.getDefault().setRenderThread(tid); } catch (Throwable t) { Log.w(LOG_TAG, "Failed to set scheduler for RenderThread", t); } } private static void initGraphicsStats(Context context, long renderProxy) { try { IBinder binder = ServiceManager.getService("graphicsstats"); Loading Loading @@ -979,6 +990,7 @@ public final class ThreadedRenderer { private static native void nSetAtlas(long nativeProxy, GraphicBuffer buffer, long[] map); private static native void nSetProcessStatsBuffer(long nativeProxy, int fd); private static native int nGetRenderThreadTid(long nativeProxy); private static native long nCreateRootRenderNode(); private static native long nCreateProxy(boolean translucent, long rootRenderNode); Loading
core/jni/android_view_ThreadedRenderer.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -554,6 +554,12 @@ static void android_view_ThreadedRenderer_setProcessStatsBuffer(JNIEnv* env, job proxy->setProcessStatsBuffer(fd); } static jint android_view_ThreadedRenderer_getRenderThreadTid(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); return proxy->getRenderThreadTid(); } static jlong android_view_ThreadedRenderer_createRootRenderNode(JNIEnv* env, jobject clazz) { RootRenderNode* node = new RootRenderNode(env); node->incStrong(0); Loading Loading @@ -870,6 +876,7 @@ static const JNINativeMethod gMethods[] = { { "nSupportsOpenGL", "!()Z", (void*) android_view_ThreadedRenderer_supportsOpenGL }, { "nSetAtlas", "(JLandroid/view/GraphicBuffer;[J)V", (void*) android_view_ThreadedRenderer_setAtlas }, { "nSetProcessStatsBuffer", "(JI)V", (void*) android_view_ThreadedRenderer_setProcessStatsBuffer }, { "nGetRenderThreadTid", "(J)I", (void*) android_view_ThreadedRenderer_getRenderThreadTid }, { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, Loading