From 1b15d13243d7e7f672713f21f0c46d88c3c067a2 Mon Sep 17 00:00:00 2001 From: Srinath Sridharan Date: Tue, 19 Jul 2016 15:16:11 -0700 Subject: [PATCH] Adding a new getThreadScheduler() method. bug: 30226969 Change-Id: Icbd57e99740ebf6ba744a103e6fa69a3160c9422 --- api/test-current.txt | 1 + core/java/android/os/Process.java | 20 ++++++++++++++++++++ core/jni/android_util_Process.cpp | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/api/test-current.txt b/api/test-current.txt index 53f87f4a3af6c..cedbea2185785 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -29225,6 +29225,7 @@ package android.os { method public static final long getStartElapsedRealtime(); method public static final long getStartUptimeMillis(); method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException; + method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException; method public static final int getUidForName(java.lang.String); method public static final boolean is64Bit(); method public static boolean isApplicationUid(int); diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 57b40e559ccd3..4ef882e1aa781 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.TestApi; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.system.Os; @@ -1067,6 +1068,24 @@ public class Process { public static final native int getThreadPriority(int tid) throws IllegalArgumentException; + /** + * Return the current scheduling policy of a thread, based on Linux. + * + * @param tid The identifier of the thread/process to get the scheduling policy. + * + * @throws IllegalArgumentException Throws IllegalArgumentException if + * tid does not exist, or if priority is out of range for the policy. + * @throws SecurityException Throws SecurityException if your process does + * not have permission to modify the given thread, or to use the given + * scheduling policy or priority. + * + * {@hide} + */ + + @TestApi + public static final native int getThreadScheduler(int tid) + throws IllegalArgumentException; + /** * Set the scheduling policy and priority of a thread, based on Linux. * @@ -1082,6 +1101,7 @@ public class Process { * * {@hide} */ + public static final native void setThreadScheduler(int tid, int policy, int priority) throws IllegalArgumentException; diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 3d952b0f713fa..a693f29aa283d 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -440,6 +440,23 @@ static void android_os_Process_setCanSelfBackground(JNIEnv* env, jobject clazz, #endif } +jint android_os_Process_getThreadScheduler(JNIEnv* env, jclass clazz, + jint tid) +{ + int policy = 0; +// linux has sched_getscheduler(), others don't. +#if defined(__linux__) + errno = 0; + policy = sched_getscheduler(tid); + if (errno != 0) { + signalExceptionForPriorityError(env, errno); + } +#else + signalExceptionForPriorityError(env, ENOSYS); +#endif + return policy; +} + void android_os_Process_setThreadScheduler(JNIEnv* env, jclass clazz, jint tid, jint policy, jint pri) { @@ -1191,6 +1208,7 @@ static const JNINativeMethod methods[] = { {"setCanSelfBackground", "(Z)V", (void*)android_os_Process_setCanSelfBackground}, {"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority}, {"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority}, + {"getThreadScheduler", "(I)I", (void*)android_os_Process_getThreadScheduler}, {"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup}, {"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup}, {"getProcessGroup", "(I)I", (void*)android_os_Process_getProcessGroup},