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>
This commit is contained in:
@@ -604,6 +604,20 @@ public class Process {
|
|||||||
*/
|
*/
|
||||||
public static final native void setThreadGroup(int tid, int group)
|
public static final native void setThreadGroup(int tid, int group)
|
||||||
throws IllegalArgumentException, SecurityException;
|
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
|
* Set the priority of the calling thread, based on Linux priorities. See
|
||||||
|
|||||||
@@ -236,6 +236,36 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint
|
|||||||
signalExceptionForGroupError(env, clazz, errno);
|
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,
|
void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz,
|
||||||
jint pid, jint pri)
|
jint pid, jint pri)
|
||||||
{
|
{
|
||||||
@@ -820,6 +850,7 @@ static const JNINativeMethod methods[] = {
|
|||||||
{"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority},
|
{"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority},
|
||||||
{"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority},
|
{"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority},
|
||||||
{"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},
|
{"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},
|
||||||
|
{"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup},
|
||||||
{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
|
{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
|
||||||
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
|
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
|
||||||
{"setUid", "(I)I", (void*)android_os_Process_setUid},
|
{"setUid", "(I)I", (void*)android_os_Process_setUid},
|
||||||
|
|||||||
Reference in New Issue
Block a user