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

Commit fac4b63e authored by Keun-young Park's avatar Keun-young Park
Browse files

add killProcessGroupOnce

- killProcessGroup retries if it fails while
  killProcessGroupOnce only tries once.
- useful for sending signal like SIGTERM once.

bug: 36696408
Test: will add usage to init
Change-Id: Ia1e3d4ec848e785a3238f262b02914695cded4c7
parent 6fb2ef1d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ __BEGIN_DECLS

int killProcessGroup(uid_t uid, int initialPid, int signal);

int killProcessGroupOnce(uid_t uid, int initialPid, int signal);

int createProcessGroup(uid_t uid, int initialPid);

void removeAllProcessGroups(void);
+11 −6
Original line number Diff line number Diff line
@@ -252,8 +252,7 @@ void removeAllProcessGroups()
    }
}

static int killProcessGroupOnce(uid_t uid, int initialPid, int signal)
{
static int doKillProcessGroupOnce(uid_t uid, int initialPid, int signal) {
    int processes = 0;
    struct ctx ctx;
    pid_t pid;
@@ -282,13 +281,11 @@ static int killProcessGroupOnce(uid_t uid, int initialPid, int signal)
    return processes;
}

int killProcessGroup(uid_t uid, int initialPid, int signal)
{
static int killProcessGroup(uid_t uid, int initialPid, int signal, int retry) {
    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();

    int retry = 40;
    int processes;
    while ((processes = killProcessGroupOnce(uid, initialPid, signal)) > 0) {
    while ((processes = doKillProcessGroupOnce(uid, initialPid, signal)) > 0) {
        LOG(VERBOSE) << "killed " << processes << " processes for processgroup " << initialPid;
        if (retry > 0) {
            std::this_thread::sleep_for(5ms);
@@ -313,6 +310,14 @@ int killProcessGroup(uid_t uid, int initialPid, int signal)
    }
}

int killProcessGroup(uid_t uid, int initialPid, int signal) {
    return killProcessGroup(uid, initialPid, signal, 40 /*maxRetry*/);
}

int killProcessGroupOnce(uid_t uid, int initialPid, int signal) {
    return killProcessGroup(uid, initialPid, signal, 0 /*maxRetry*/);
}

static bool mkdirAndChown(const char *path, mode_t mode, uid_t uid, gid_t gid)
{
    if (mkdir(path, mode) == -1 && errno != EEXIST) {