core: watch SIGCHLD more closely to track processes of units with no reliable cgroup empty notifier
When a process dies that we can associate with a specific unit, start watching all other processes of that unit, so that we can associate those processes with the unit too. Also, for service units start doing this as soon as we get the first SIGCHLD for either control or main process, so that we can follow the processes of the service from one to the other, as long as process that remain are processes of the ones we watched that died and got reassigned to us as parent. Similar, for scope units start doing this as soon as the scope controller abandons the unit, and thus management entirely reverts to systemd. To abandon a unit introduce a new Abandon() scope unit method call.
This commit is contained in:
@@ -203,6 +203,11 @@ struct Unit {
|
||||
/* CGroup realize members queue */
|
||||
LIST_FIELDS(Unit, cgroup_queue);
|
||||
|
||||
/* PIDs we keep an eye on. Note that a unit might have many
|
||||
* more, but these are the ones we care enough about to
|
||||
* process SIGCHLD for */
|
||||
Set *pids;
|
||||
|
||||
/* Used during GC sweeps */
|
||||
unsigned gc_marker;
|
||||
|
||||
@@ -538,6 +543,10 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
|
||||
|
||||
int unit_watch_pid(Unit *u, pid_t pid);
|
||||
void unit_unwatch_pid(Unit *u, pid_t pid);
|
||||
int unit_watch_all_pids(Unit *u);
|
||||
void unit_unwatch_all_pids(Unit *u);
|
||||
|
||||
void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
|
||||
|
||||
int unit_watch_bus_name(Unit *u, const char *name);
|
||||
void unit_unwatch_bus_name(Unit *u, const char *name);
|
||||
|
||||
Reference in New Issue
Block a user