From 3e22239da7a05c3c0d45fe1059a1a59dd29bcb5f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 24 Jan 2024 14:08:40 +0900 Subject: [PATCH] core: introduce unit_main_pid_full() which optionally provides if the PID is alien or not --- src/core/service.c | 9 +++++++-- src/core/unit.c | 6 ++++-- src/core/unit.h | 7 +++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/core/service.c b/src/core/service.c index aacfe0d57e..4f53a0dc06 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -4786,8 +4786,13 @@ static void service_reset_failed(Unit *u) { s->flush_n_restarts = false; } -static PidRef* service_main_pid(Unit *u) { - return &ASSERT_PTR(SERVICE(u))->main_pid; +static PidRef* service_main_pid(Unit *u, bool *ret_is_alien) { + Service *s = ASSERT_PTR(SERVICE(u)); + + if (ret_is_alien) + *ret_is_alien = s->main_pid_alien; + + return &s->main_pid; } static PidRef* service_control_pid(Unit *u) { diff --git a/src/core/unit.c b/src/core/unit.c index 3a3e5f4920..1c7225bb8f 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -5112,12 +5112,14 @@ PidRef* unit_control_pid(Unit *u) { return NULL; } -PidRef* unit_main_pid(Unit *u) { +PidRef* unit_main_pid_full(Unit *u, bool *ret_is_alien) { assert(u); if (UNIT_VTABLE(u)->main_pid) - return UNIT_VTABLE(u)->main_pid(u); + return UNIT_VTABLE(u)->main_pid(u, ret_is_alien); + if (ret_is_alien) + *ret_is_alien = false; return NULL; } diff --git a/src/core/unit.h b/src/core/unit.h index 115ab56eaa..eb94ff2964 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -732,7 +732,7 @@ typedef struct UnitVTable { usec_t (*get_timeout_start_usec)(Unit *u); /* Returns the main PID if there is any defined, or 0. */ - PidRef* (*main_pid)(Unit *u); + PidRef* (*main_pid)(Unit *u, bool *ret_is_alien); /* Returns the control PID if there is any defined, or 0. */ PidRef* (*control_pid)(Unit *u); @@ -1021,7 +1021,10 @@ bool unit_is_upheld_by_active(Unit *u, Unit **ret_culprit); bool unit_is_bound_by_inactive(Unit *u, Unit **ret_culprit); PidRef* unit_control_pid(Unit *u); -PidRef* unit_main_pid(Unit *u); +PidRef* unit_main_pid_full(Unit *u, bool *ret_is_alien); +static inline PidRef* unit_main_pid(Unit *u) { + return unit_main_pid_full(u, NULL); +} void unit_warn_if_dir_nonempty(Unit *u, const char* where); int unit_fail_if_noncanonical(Unit *u, const char* where);