mirror of
https://github.com/systemd/systemd.git
synced 2024-10-27 10:25:37 +03:00
macro: introduce new PID_TO_PTR macros and make use of them
This adds a new PID_TO_PTR() macro, plus PTR_TO_PID() and makes use of it wherever we maintain processes in a hash table. Previously we sometimes used LONG_TO_PTR() and other times ULONG_TO_PTR() for that, hence let's make this more explicit and clean up things.
This commit is contained in:
parent
a8ba86ce6a
commit
fea72cc033
@ -187,7 +187,7 @@ int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
|
||||
if (ignore_self && pid == my_pid)
|
||||
continue;
|
||||
|
||||
if (set_get(s, LONG_TO_PTR(pid)) == LONG_TO_PTR(pid))
|
||||
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
|
||||
continue;
|
||||
|
||||
/* If we haven't killed this process yet, kill
|
||||
@ -205,7 +205,7 @@ int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo
|
||||
|
||||
done = false;
|
||||
|
||||
r = set_put(s, LONG_TO_PTR(pid));
|
||||
r = set_put(s, PID_TO_PTR(pid));
|
||||
if (r < 0) {
|
||||
if (ret >= 0)
|
||||
return r;
|
||||
@ -318,7 +318,7 @@ int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
|
||||
if (ignore_self && pid == my_pid)
|
||||
continue;
|
||||
|
||||
if (set_get(s, LONG_TO_PTR(pid)) == LONG_TO_PTR(pid))
|
||||
if (set_get(s, PID_TO_PTR(pid)) == PID_TO_PTR(pid))
|
||||
continue;
|
||||
|
||||
/* Ignore kernel threads. Since they can only
|
||||
@ -338,7 +338,7 @@ int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
|
||||
|
||||
done = false;
|
||||
|
||||
r = set_put(s, LONG_TO_PTR(pid));
|
||||
r = set_put(s, PID_TO_PTR(pid));
|
||||
if (r < 0) {
|
||||
if (ret >= 0)
|
||||
return r;
|
||||
@ -1898,7 +1898,7 @@ int cg_attach_many_everywhere(CGroupMask supported, const char *path, Set* pids,
|
||||
int r = 0;
|
||||
|
||||
SET_FOREACH(pidp, pids, i) {
|
||||
pid_t pid = PTR_TO_LONG(pidp);
|
||||
pid_t pid = PTR_TO_PID(pidp);
|
||||
int q;
|
||||
|
||||
q = cg_attach_everywhere(supported, path, pid, path_callback, userdata);
|
||||
|
@ -298,6 +298,9 @@ static inline unsigned long ALIGN_POWER2(unsigned long u) {
|
||||
#define PTR_TO_GID(p) ((gid_t) (((uintptr_t) (p))-1))
|
||||
#define GID_TO_PTR(u) ((void*) (((uintptr_t) (u))+1))
|
||||
|
||||
#define PTR_TO_PID(p) ((pid_t) ((uintptr_t) p))
|
||||
#define PID_TO_PTR(p) ((void*) ((uintptr_t) p))
|
||||
|
||||
#define memzero(x,l) (memset((x), 0, (l)))
|
||||
#define zero(x) (memzero(&(x), sizeof(x)))
|
||||
|
||||
|
@ -1391,11 +1391,11 @@ Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
|
||||
if (pid == 1)
|
||||
return hashmap_get(m->units, SPECIAL_INIT_SCOPE);
|
||||
|
||||
u = hashmap_get(m->watch_pids1, LONG_TO_PTR(pid));
|
||||
u = hashmap_get(m->watch_pids1, PID_TO_PTR(pid));
|
||||
if (u)
|
||||
return u;
|
||||
|
||||
u = hashmap_get(m->watch_pids2, LONG_TO_PTR(pid));
|
||||
u = hashmap_get(m->watch_pids2, PID_TO_PTR(pid));
|
||||
if (u)
|
||||
return u;
|
||||
|
||||
|
@ -108,7 +108,7 @@ static void wait_for_children(Set *pids, sigset_t *mask) {
|
||||
return;
|
||||
}
|
||||
|
||||
set_remove(pids, ULONG_TO_PTR(pid));
|
||||
(void) set_remove(pids, PID_TO_PTR(pid));
|
||||
}
|
||||
|
||||
/* Now explicitly check who might be remaining, who
|
||||
@ -117,7 +117,7 @@ static void wait_for_children(Set *pids, sigset_t *mask) {
|
||||
|
||||
/* We misuse getpgid as a check whether a
|
||||
* process still exists. */
|
||||
if (getpgid((pid_t) PTR_TO_ULONG(p)) >= 0)
|
||||
if (getpgid(PTR_TO_PID(p)) >= 0)
|
||||
continue;
|
||||
|
||||
if (errno != ESRCH)
|
||||
@ -179,7 +179,7 @@ static int killall(int sig, Set *pids, bool send_sighup) {
|
||||
|
||||
if (kill(pid, sig) >= 0) {
|
||||
if (pids) {
|
||||
r = set_put(pids, ULONG_TO_PTR(pid));
|
||||
r = set_put(pids, PID_TO_PTR(pid));
|
||||
if (r < 0)
|
||||
log_oom();
|
||||
}
|
||||
|
@ -1591,13 +1591,13 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
|
||||
found = true;
|
||||
}
|
||||
|
||||
u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(ucred->pid));
|
||||
u2 = hashmap_get(m->watch_pids1, PID_TO_PTR(ucred->pid));
|
||||
if (u2 && u2 != u1) {
|
||||
manager_invoke_notify_message(m, u2, ucred->pid, buf, n, fds);
|
||||
found = true;
|
||||
}
|
||||
|
||||
u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(ucred->pid));
|
||||
u3 = hashmap_get(m->watch_pids2, PID_TO_PTR(ucred->pid));
|
||||
if (u3 && u3 != u2 && u3 != u1) {
|
||||
manager_invoke_notify_message(m, u3, ucred->pid, buf, n, fds);
|
||||
found = true;
|
||||
@ -1666,10 +1666,10 @@ static int manager_dispatch_sigchld(Manager *m) {
|
||||
u1 = manager_get_unit_by_pid(m, si.si_pid);
|
||||
if (u1)
|
||||
invoke_sigchld_event(m, u1, &si);
|
||||
u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
|
||||
u2 = hashmap_get(m->watch_pids1, PID_TO_PTR(si.si_pid));
|
||||
if (u2 && u2 != u1)
|
||||
invoke_sigchld_event(m, u2, &si);
|
||||
u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
|
||||
u3 = hashmap_get(m->watch_pids2, PID_TO_PTR(si.si_pid));
|
||||
if (u3 && u3 != u2 && u3 != u1)
|
||||
invoke_sigchld_event(m, u3, &si);
|
||||
}
|
||||
|
@ -1995,16 +1995,16 @@ int unit_watch_pid(Unit *u, pid_t pid) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
|
||||
r = hashmap_put(u->manager->watch_pids1, PID_TO_PTR(pid), u);
|
||||
if (r == -EEXIST) {
|
||||
r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
|
||||
r = hashmap_put(u->manager->watch_pids2, PID_TO_PTR(pid), u);
|
||||
}
|
||||
|
||||
q = set_put(u->pids, LONG_TO_PTR(pid));
|
||||
q = set_put(u->pids, PID_TO_PTR(pid));
|
||||
if (q < 0)
|
||||
return q;
|
||||
|
||||
@ -2015,16 +2015,16 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
|
||||
assert(u);
|
||||
assert(pid >= 1);
|
||||
|
||||
(void) hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
|
||||
(void) hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
|
||||
(void) set_remove(u->pids, LONG_TO_PTR(pid));
|
||||
(void) hashmap_remove_value(u->manager->watch_pids1, PID_TO_PTR(pid), u);
|
||||
(void) hashmap_remove_value(u->manager->watch_pids2, PID_TO_PTR(pid), u);
|
||||
(void) set_remove(u->pids, PID_TO_PTR(pid));
|
||||
}
|
||||
|
||||
void unit_unwatch_all_pids(Unit *u) {
|
||||
assert(u);
|
||||
|
||||
while (!set_isempty(u->pids))
|
||||
unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
|
||||
unit_unwatch_pid(u, PTR_TO_PID(set_first(u->pids)));
|
||||
|
||||
u->pids = set_free(u->pids);
|
||||
}
|
||||
@ -2038,7 +2038,7 @@ void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
|
||||
/* Cleans dead PIDs from our list */
|
||||
|
||||
SET_FOREACH(e, u->pids, i) {
|
||||
pid_t pid = PTR_TO_LONG(e);
|
||||
pid_t pid = PTR_TO_PID(e);
|
||||
|
||||
if (pid == except1 || pid == except2)
|
||||
continue;
|
||||
@ -2993,13 +2993,13 @@ static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
|
||||
|
||||
/* Exclude the main/control pids from being killed via the cgroup */
|
||||
if (main_pid > 0) {
|
||||
r = set_put(pid_set, LONG_TO_PTR(main_pid));
|
||||
r = set_put(pid_set, PID_TO_PTR(main_pid));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (control_pid > 0) {
|
||||
r = set_put(pid_set, LONG_TO_PTR(control_pid));
|
||||
r = set_put(pid_set, PID_TO_PTR(control_pid));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user