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

Commit 42bab746 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan Committed by Automerger Merge Worker
Browse files

Merge changes from topic "228160715_fix" am: 25f0c1c4

parents acb8def0 25f0c1c4
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -288,6 +288,10 @@ void Service::Reap(const siginfo_t& siginfo) {


    if (flags_ & SVC_EXEC) UnSetExec();
    if (flags_ & SVC_EXEC) UnSetExec();


    if (name_ == "zygote" || name_ == "zygote64") {
        removeAllEmptyProcessGroups();
    }

    if (flags_ & SVC_TEMPORARY) return;
    if (flags_ & SVC_TEMPORARY) return;


    pid_ = 0;
    pid_ = 0;
+1 −0
Original line number Original line Diff line number Diff line
@@ -67,6 +67,7 @@ bool setProcessGroupSoftLimit(uid_t uid, int initialPid, int64_t softLimitInByte
bool setProcessGroupLimit(uid_t uid, int initialPid, int64_t limitInBytes);
bool setProcessGroupLimit(uid_t uid, int initialPid, int64_t limitInBytes);


void removeAllProcessGroups(void);
void removeAllProcessGroups(void);
void removeAllEmptyProcessGroups(void);


// Provides the path for an attribute in a specific process group
// Provides the path for an attribute in a specific process group
// Returns false in case of error, true in case of success
// Returns false in case of error, true in case of success
+28 −5
Original line number Original line Diff line number Diff line
@@ -200,7 +200,7 @@ static int RemoveProcessGroup(const char* cgroup, uid_t uid, int pid, unsigned i
    return ret;
    return ret;
}
}


static bool RemoveUidProcessGroups(const std::string& uid_path) {
static bool RemoveUidProcessGroups(const std::string& uid_path, bool empty_only) {
    std::unique_ptr<DIR, decltype(&closedir)> uid(opendir(uid_path.c_str()), closedir);
    std::unique_ptr<DIR, decltype(&closedir)> uid(opendir(uid_path.c_str()), closedir);
    bool empty = true;
    bool empty = true;
    if (uid != NULL) {
    if (uid != NULL) {
@@ -215,6 +215,21 @@ static bool RemoveUidProcessGroups(const std::string& uid_path) {
            }
            }


            auto path = StringPrintf("%s/%s", uid_path.c_str(), dir->d_name);
            auto path = StringPrintf("%s/%s", uid_path.c_str(), dir->d_name);
            if (empty_only) {
                struct stat st;
                auto procs_file = StringPrintf("%s/%s", path.c_str(),
                                               PROCESSGROUP_CGROUP_PROCS_FILE);
                if (stat(procs_file.c_str(), &st) == -1) {
                    PLOG(ERROR) << "Failed to get stats for " << procs_file;
                    continue;
                }
                if (st.st_size > 0) {
                    // skip non-empty groups
                    LOG(VERBOSE) << "Skipping non-empty group " << path;
                    empty = false;
                    continue;
                }
            }
            LOG(VERBOSE) << "Removing " << path;
            LOG(VERBOSE) << "Removing " << path;
            if (rmdir(path.c_str()) == -1) {
            if (rmdir(path.c_str()) == -1) {
                if (errno != EBUSY) {
                if (errno != EBUSY) {
@@ -227,9 +242,7 @@ static bool RemoveUidProcessGroups(const std::string& uid_path) {
    return empty;
    return empty;
}
}


void removeAllProcessGroups() {
void removeAllProcessGroupsInternal(bool empty_only) {
    LOG(VERBOSE) << "removeAllProcessGroups()";

    std::vector<std::string> cgroups;
    std::vector<std::string> cgroups;
    std::string path, memcg_apps_path;
    std::string path, memcg_apps_path;


@@ -256,7 +269,7 @@ void removeAllProcessGroups() {
                }
                }


                auto path = StringPrintf("%s/%s", cgroup_root_path.c_str(), dir->d_name);
                auto path = StringPrintf("%s/%s", cgroup_root_path.c_str(), dir->d_name);
                if (!RemoveUidProcessGroups(path)) {
                if (!RemoveUidProcessGroups(path, empty_only)) {
                    LOG(VERBOSE) << "Skip removing " << path;
                    LOG(VERBOSE) << "Skip removing " << path;
                    continue;
                    continue;
                }
                }
@@ -269,6 +282,16 @@ void removeAllProcessGroups() {
    }
    }
}
}


void removeAllProcessGroups() {
    LOG(VERBOSE) << "removeAllProcessGroups()";
    removeAllProcessGroupsInternal(false);
}

void removeAllEmptyProcessGroups() {
    LOG(VERBOSE) << "removeAllEmptyProcessGroups()";
    removeAllProcessGroupsInternal(true);
}

/**
/**
 * Process groups are primarily created by the Zygote, meaning that uid/pid groups are created by
 * Process groups are primarily created by the Zygote, meaning that uid/pid groups are created by
 * the user root. Ownership for the newly created cgroup and all of its files must thus be
 * the user root. Ownership for the newly created cgroup and all of its files must thus be