diff options
| -rw-r--r-- | core/java/android/os/Process.java | 9 | ||||
| -rw-r--r-- | core/jni/android_util_Process.cpp | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessRecord.java | 5 |
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; } |