summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/Process.java9
-rw-r--r--core/jni/android_util_Process.cpp6
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java5
3 files changed, 18 insertions, 2 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index b2208d19d9ee..bf3d52d358ed 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -1499,6 +1499,15 @@ public class Process {
public static final native int killProcessGroup(int uid, int pid);
/**
+ * Send a signal to all processes in a group under the given PID, but do not wait for the
+ * processes to be fully cleaned up, or for the cgroup to be removed before returning.
+ * Callers should also ensure that killProcessGroup is called later to ensure the cgroup is
+ * fully removed, otherwise system resources may leak.
+ * @hide
+ */
+ public static final native int sendSignalToProcessGroup(int uid, int pid, int signal);
+
+ /**
* Freeze the cgroup for the given UID.
* This cgroup may contain child cgroups which will also be frozen. If this cgroup or its
* children contain processes with Binder interfaces, those interfaces should be frozen before
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 9501c8d49e53..4f2bf4a4f6cb 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -1238,6 +1238,11 @@ jint android_os_Process_killProcessGroup(JNIEnv* env, jobject clazz, jint uid, j
return killProcessGroup(uid, pid, SIGKILL);
}
+jint android_os_Process_sendSignalToProcessGroup(JNIEnv* env, jobject clazz, jint uid, jint pid,
+ jint signal) {
+ return sendSignalToProcessGroup(uid, pid, signal);
+}
+
void android_os_Process_removeAllProcessGroups(JNIEnv* env, jobject clazz)
{
return removeAllProcessGroups();
@@ -1305,6 +1310,7 @@ static const JNINativeMethod methods[] = {
//{"setApplicationObject", "(Landroid/os/IBinder;)V",
//(void*)android_os_Process_setApplicationObject},
{"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},
+ {"sendSignalToProcessGroup", "(III)I", (void*)android_os_Process_sendSignalToProcessGroup},
{"removeAllProcessGroups", "()V", (void*)android_os_Process_removeAllProcessGroups},
{"nativePidFdOpen", "(II)I", (void*)android_os_Process_nativePidFdOpen},
{"freezeCgroupUid", "(IZ)V", (void*)android_os_Process_freezeCgroupUID},
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index ffb40ee959a4..438a08c44ef4 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -47,6 +47,7 @@ import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.server.ServerProtoEnums;
+import android.system.OsConstants;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.DebugUtils;
@@ -1186,8 +1187,8 @@ class ProcessRecord implements WindowProcessListener {
EventLog.writeEvent(EventLogTags.AM_KILL,
userId, mPid, processName, mState.getSetAdj(), reason);
Process.killProcessQuiet(mPid);
- if (asyncKPG) ProcessList.killProcessGroup(uid, mPid);
- else Process.killProcessGroup(uid, mPid);
+ if (!asyncKPG) Process.sendSignalToProcessGroup(uid, mPid, OsConstants.SIGKILL);
+ ProcessList.killProcessGroup(uid, mPid);
} else {
mPendingStart = false;
}