Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6fb2259 authored by T.J. Mercier's avatar T.J. Mercier
Browse files

libprocessgroup: Use pid_t consistently for PIDs

Test: m
Change-Id: Ibcef6b73a8fd3088c88b822a6b33d005595488b2
parent a757eb85
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -67,25 +67,25 @@ void DropTaskProfilesResourceCaching();

// Return 0 if all processes were killed and the cgroup was successfully removed.
// Returns -1 in the case of an error occurring or if there are processes still running.
int killProcessGroup(uid_t uid, int initialPid, int signal);
int killProcessGroup(uid_t uid, pid_t initialPid, int signal);

// Returns the same as killProcessGroup(), however it does not retry, which means
// that it only returns 0 in the case that the cgroup exists and it contains no processes.
int killProcessGroupOnce(uid_t uid, int initialPid, int signal);
int killProcessGroupOnce(uid_t uid, pid_t initialPid, int signal);

// Sends the provided signal to all members of a process group, but does not wait for processes to
// exit, or for the cgroup to be removed. Callers should also ensure that killProcessGroup is called
// later to ensure the cgroup is fully removed, otherwise system resources will leak.
// Returns true if no errors are encountered sending signals, otherwise false.
bool sendSignalToProcessGroup(uid_t uid, int initialPid, int signal);
bool sendSignalToProcessGroup(uid_t uid, pid_t initialPid, int signal);

int createProcessGroup(uid_t uid, int initialPid, bool memControl = false);
int createProcessGroup(uid_t uid, pid_t initialPid, bool memControl = false);

// Set various properties of a process group. For these functions to work, the process group must
// have been created by passing memControl=true to createProcessGroup.
bool setProcessGroupSwappiness(uid_t uid, int initialPid, int swappiness);
bool setProcessGroupSoftLimit(uid_t uid, int initialPid, int64_t softLimitInBytes);
bool setProcessGroupLimit(uid_t uid, int initialPid, int64_t limitInBytes);
bool setProcessGroupSwappiness(uid_t uid, pid_t initialPid, int swappiness);
bool setProcessGroupSoftLimit(uid_t uid, pid_t initialPid, int64_t softLimitInBytes);
bool setProcessGroupLimit(uid_t uid, pid_t initialPid, int64_t limitInBytes);

void removeAllEmptyProcessGroups(void);

@@ -95,7 +95,7 @@ bool getAttributePathForTask(const std::string& attr_name, int tid, std::string*

// Check if a profile can be applied without failing.
// Returns true if it can be applied without failing, false otherwise
bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, int pid);
bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, pid_t pid);

#endif // __ANDROID_VNDK__

+12 −12
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ static std::string ConvertUidToPath(const char* cgroup, uid_t uid) {
    return StringPrintf("%s/uid_%u", cgroup, uid);
}

static std::string ConvertUidPidToPath(const char* cgroup, uid_t uid, int pid) {
static std::string ConvertUidPidToPath(const char* cgroup, uid_t uid, pid_t pid) {
    return StringPrintf("%s/uid_%u/pid_%d", cgroup, uid, pid);
}

@@ -232,7 +232,7 @@ bool SetUserProfiles(uid_t uid, const std::vector<std::string>& profiles) {
                                                       false);
}

static int RemoveCgroup(const char* cgroup, uid_t uid, int pid) {
static int RemoveCgroup(const char* cgroup, uid_t uid, pid_t pid) {
    auto path = ConvertUidPidToPath(cgroup, uid, pid);
    int ret = TEMP_FAILURE_RETRY(rmdir(path.c_str()));

@@ -370,7 +370,7 @@ err:
    return false;
}

bool sendSignalToProcessGroup(uid_t uid, int initialPid, int signal) {
bool sendSignalToProcessGroup(uid_t uid, pid_t initialPid, int signal) {
    std::set<pid_t> pgids, pids;

    if (CgroupsAvailable()) {
@@ -525,7 +525,7 @@ static populated_status cgroupIsPopulated(int events_fd) {
// implementation of this function. The default retry value was 40 for killing and 400 for cgroup
// removal with 5ms sleeps between each retry.
static int KillProcessGroup(
        uid_t uid, int initialPid, int signal, bool once = false,
        uid_t uid, pid_t initialPid, int signal, bool once = false,
        std::chrono::steady_clock::time_point until = std::chrono::steady_clock::now() + 2200ms) {
    CHECK_GE(uid, 0);
    CHECK_GT(initialPid, 0);
@@ -632,15 +632,15 @@ static int KillProcessGroup(
    return ret;
}

int killProcessGroup(uid_t uid, int initialPid, int signal) {
int killProcessGroup(uid_t uid, pid_t initialPid, int signal) {
    return KillProcessGroup(uid, initialPid, signal);
}

int killProcessGroupOnce(uid_t uid, int initialPid, int signal) {
int killProcessGroupOnce(uid_t uid, pid_t initialPid, int signal) {
    return KillProcessGroup(uid, initialPid, signal, true);
}

static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup,
static int createProcessGroupInternal(uid_t uid, pid_t initialPid, std::string cgroup,
                                      bool activate_controllers) {
    auto uid_path = ConvertUidToPath(cgroup.c_str(), uid);

@@ -687,7 +687,7 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr
    return ret;
}

int createProcessGroup(uid_t uid, int initialPid, bool memControl) {
int createProcessGroup(uid_t uid, pid_t initialPid, bool memControl) {
    CHECK_GE(uid, 0);
    CHECK_GT(initialPid, 0);

@@ -731,15 +731,15 @@ static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t
    return true;
}

bool setProcessGroupSwappiness(uid_t, int pid, int swappiness) {
bool setProcessGroupSwappiness(uid_t, pid_t pid, int swappiness) {
    return SetProcessGroupValue(pid, "MemSwappiness", swappiness);
}

bool setProcessGroupSoftLimit(uid_t, int pid, int64_t soft_limit_in_bytes) {
bool setProcessGroupSoftLimit(uid_t, pid_t pid, int64_t soft_limit_in_bytes) {
    return SetProcessGroupValue(pid, "MemSoftLimit", soft_limit_in_bytes);
}

bool setProcessGroupLimit(uid_t, int pid, int64_t limit_in_bytes) {
bool setProcessGroupLimit(uid_t, pid_t pid, int64_t limit_in_bytes) {
    return SetProcessGroupValue(pid, "MemLimit", limit_in_bytes);
}

@@ -747,7 +747,7 @@ bool getAttributePathForTask(const std::string& attr_name, int tid, std::string*
    return CgroupGetAttributePathForTask(attr_name, tid, path);
}

bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, int pid) {
bool isProfileValidForProcess(const std::string& profile_name, uid_t uid, pid_t pid) {
    const TaskProfile* tp = TaskProfiles::GetInstance().GetProfile(profile_name);

    if (tp == nullptr) {
+2 −2
Original line number Diff line number Diff line
@@ -489,7 +489,7 @@ WriteFileAction::WriteFileAction(const std::string& task_path, const std::string
}

bool WriteFileAction::WriteValueToFile(const std::string& value_, ResourceCacheType cache_type,
                                       uid_t uid, int pid, bool logfailures) const {
                                       uid_t uid, pid_t pid, bool logfailures) const {
    std::string value(value_);

    value = StringReplace(value, "<uid>", std::to_string(uid), true);
@@ -564,7 +564,7 @@ bool WriteFileAction::ExecuteForProcess(uid_t uid, pid_t pid) const {
    DIR* d;
    struct dirent* de;
    char proc_path[255];
    int t_pid;
    pid_t t_pid;

    sprintf(proc_path, "/proc/%d/task", pid);
    if (!(d = opendir(proc_path))) {
+1 −1
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ class WriteFileAction : public ProfileAction {
    mutable std::mutex fd_mutex_;

    bool WriteValueToFile(const std::string& value, ResourceCacheType cache_type, uid_t uid,
                          int pid, bool logfailures) const;
                          pid_t pid, bool logfailures) const;
    CacheUseResult UseCachedFd(ResourceCacheType cache_type, const std::string& value) const;
};