diff options
author | San Mehat <san@google.com> | 2009-05-19 14:44:16 -0700 |
---|---|---|
committer | San Mehat <san@google.com> | 2009-05-19 14:44:16 -0700 |
commit | 3e458241d9930465a20a861ecb42744355d48e48 (patch) | |
tree | 4c049f6e3f3153aed05b7e12d07a05c35d06aca8 /core | |
parent | 65ff54c44bbd8c1dd6818d42b7c91c634c644aa9 (diff) | |
download | frameworks_base-3e458241d9930465a20a861ecb42744355d48e48.zip frameworks_base-3e458241d9930465a20a861ecb42744355d48e48.tar.gz frameworks_base-3e458241d9930465a20a861ecb42744355d48e48.tar.bz2 |
process: Add setProcessGroup() hidden API call to set the cgroup of
a process and all its child threads.
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/os/Process.java | 14 | ||||
-rw-r--r-- | core/jni/android_util_Process.cpp | 31 |
2 files changed, 45 insertions, 0 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 30acef9..333c7cb 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -604,6 +604,20 @@ public class Process { */ public static final native void setThreadGroup(int tid, int group) throws IllegalArgumentException, SecurityException; + /** + * Sets the scheduling group for a process and all child threads + * @hide + * @param pid The indentifier of the process to change. + * @param group The target group for this process. + * + * @throws IllegalArgumentException Throws IllegalArgumentException if + * <var>tid</var> does not exist. + * @throws SecurityException Throws SecurityException if your process does + * not have permission to modify the given thread, or to use the given + * priority. + */ + public static final native void setProcessGroup(int pid, int group) + throws IllegalArgumentException, SecurityException; /** * Set the priority of the calling thread, based on Linux priorities. See diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index d760feb..95c38dc 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -236,6 +236,36 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint signalExceptionForGroupError(env, clazz, errno); } +void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jint grp) +{ + DIR *d; + FILE *fp; + char proc_path[255]; + struct dirent *de; + + if (grp > ANDROID_TGROUP_MAX || grp < 0) { + signalExceptionForGroupError(env, clazz, EINVAL); + return; + } + + sprintf(proc_path, "/proc/%d/task", pid); + if (!(d = opendir(proc_path))) { + signalExceptionForGroupError(env, clazz, errno); + return; + } + + while ((de = readdir(d))) { + if (de->d_name[0] == '.') + continue; + if (add_pid_to_cgroup(atoi(de->d_name), grp)) { + signalExceptionForGroupError(env, clazz, errno); + closedir(d); + return; + } + } + closedir(d); +} + void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, jint pid, jint pri) { @@ -820,6 +850,7 @@ static const JNINativeMethod methods[] = { {"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority}, {"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority}, {"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup}, + {"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup}, {"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj}, {"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0}, {"setUid", "(I)I", (void*)android_os_Process_setUid}, |