summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2009-05-19 14:44:16 -0700
committerSan Mehat <san@google.com>2009-05-19 14:44:16 -0700
commit3e458241d9930465a20a861ecb42744355d48e48 (patch)
tree4c049f6e3f3153aed05b7e12d07a05c35d06aca8 /core
parent65ff54c44bbd8c1dd6818d42b7c91c634c644aa9 (diff)
downloadframeworks_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.java14
-rw-r--r--core/jni/android_util_Process.cpp31
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},