pidref: add pidref_equal() helper
This compares two PidRef structures via the pid_t field. Ideally we'd do a stricter comparison here, that is safe towards PID reuse, but so far the pidfd API lacks suitable mechanisms for that, hence do the best we can do.
This commit is contained in:
committed by
Mike Yuan
parent
648cb0248d
commit
3b74b4958b
@@ -15,6 +15,18 @@ static inline bool pidref_is_set(const PidRef *pidref) {
|
||||
return pidref && pidref->pid > 0;
|
||||
}
|
||||
|
||||
static inline bool pidref_equal(const PidRef *a, const PidRef *b) {
|
||||
|
||||
if (pidref_is_set(a)) {
|
||||
if (!pidref_is_set(b))
|
||||
return false;
|
||||
|
||||
return a->pid == b->pid;
|
||||
}
|
||||
|
||||
return !pidref_is_set(b);
|
||||
}
|
||||
|
||||
int pidref_set_pid(PidRef *pidref, pid_t pid);
|
||||
int pidref_set_pidstr(PidRef *pidref, const char *pid);
|
||||
int pidref_set_pidfd(PidRef *pidref, int fd);
|
||||
|
||||
+2
-2
@@ -193,12 +193,12 @@ static int service_set_main_pidref(Service *s, PidRef *pidref) {
|
||||
if (pidref->pid == getpid_cached())
|
||||
return -EINVAL;
|
||||
|
||||
if (s->main_pid.pid == pidref->pid && s->main_pid_known) {
|
||||
if (pidref_equal(&s->main_pid, pidref) && s->main_pid_known) {
|
||||
pidref_done(pidref);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (s->main_pid.pid != pidref->pid) {
|
||||
if (!pidref_equal(&s->main_pid, pidref)) {
|
||||
service_unwatch_main_pid(s);
|
||||
exec_status_start(&s->main_exec_status, pidref->pid);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user