diff --git a/reaper.cpp b/reaper.cpp index d5e98bf..50fe088 100644 --- a/reaper.cpp +++ b/reaper.cpp @@ -53,6 +53,41 @@ static inline long get_time_diff_ms(struct timespec *from, (to->tv_nsec - from->tv_nsec) / (long)NS_PER_MS; } +static void set_process_group_and_prio(uid_t uid, int pid, const std::vector& profiles, + int prio) { + DIR* d; + char proc_path[PATH_MAX]; + struct dirent* de; + + if (!SetProcessProfilesCached(uid, pid, profiles)) { + ALOGW("Failed to set task profiles for the process (%d) being killed", pid); + } + + snprintf(proc_path, sizeof(proc_path), "/proc/%d/task", pid); + if (!(d = opendir(proc_path))) { + ALOGW("Failed to open %s; errno=%d: process pid(%d) might have died", proc_path, errno, + pid); + return; + } + + while ((de = readdir(d))) { + int t_pid; + + if (de->d_name[0] == '.') continue; + t_pid = atoi(de->d_name); + + if (!t_pid) { + ALOGW("Failed to get t_pid for '%s' of pid(%d)", de->d_name, pid); + continue; + } + + if (setpriority(PRIO_PROCESS, t_pid, prio) && errno != ESRCH) { + ALOGW("Unable to raise priority of killing t_pid (%d): errno=%d", t_pid, errno); + } + } + closedir(d); +} + static void* reaper_main(void* param) { Reaper *reaper = static_cast(param); struct timespec start_tm, end_tm; @@ -80,8 +115,13 @@ static void* reaper_main(void* param) { reaper->notify_kill_failure(target.pid); goto done; } + + set_process_group_and_prio(target.uid, target.pid, + {"CPUSET_SP_FOREGROUND", "SCHED_SP_FOREGROUND"}, + ANDROID_PRIORITY_NORMAL); + if (process_mrelease(target.pidfd, 0)) { - ALOGE("process_mrelease %d failed: %s", target.pidfd, strerror(errno)); + ALOGE("process_mrelease %d failed: %s", target.pid, strerror(errno)); goto done; } if (reaper->debug_enabled()) { @@ -90,13 +130,6 @@ static void* reaper_main(void* param) { get_time_diff_ms(&start_tm, &end_tm)); } - if (!SetProcessProfilesCached(target.uid, target.pid, - {"CPUSET_SP_FOREGROUND", "SCHED_SP_FOREGROUND"})) { - if (reaper->debug_enabled()) { - ALOGW("Failed to set task profiles for the process (%d) being killed", target.pid); - } - } - done: close(target.pidfd); reaper->request_complete();