Merge pull request #7991 from poettering/n-on-console
a comprehensive fix for the n_on_console miscounting issue
This commit is contained in:
+23
-4
@@ -2449,8 +2449,15 @@ static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32
|
||||
assert(m);
|
||||
assert(m->idle_pipe[2] == fd);
|
||||
|
||||
/* There's at least one Type=idle child that just gave up on us waiting for the boot process to complete. Let's
|
||||
* now turn off any further console output if there's at least one service that needs console access, so that
|
||||
* from now on our own output should not spill into that service's output anymore. After all, we support
|
||||
* Type=idle only to beautify console output and it generally is set on services that want to own the console
|
||||
* exclusively without our interference. */
|
||||
m->no_console_output = m->n_on_console > 0;
|
||||
|
||||
/* Acknowledge the child's request, and let all all other children know too that they shouldn't wait any longer
|
||||
* by closing the pipes towards them, which is what they are waiting for. */
|
||||
manager_close_idle_pipe(m);
|
||||
|
||||
return 0;
|
||||
@@ -3567,10 +3574,7 @@ static bool manager_get_show_status(Manager *m, StatusType type) {
|
||||
if (type != STATUS_TYPE_EMERGENCY && manager_check_ask_password(m) > 0)
|
||||
return false;
|
||||
|
||||
if (m->show_status > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return m->show_status > 0;
|
||||
}
|
||||
|
||||
const char *manager_get_confirm_spawn(Manager *m) {
|
||||
@@ -4094,6 +4098,21 @@ char *manager_taint_string(Manager *m) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
void manager_ref_console(Manager *m) {
|
||||
assert(m);
|
||||
|
||||
m->n_on_console++;
|
||||
}
|
||||
|
||||
void manager_unref_console(Manager *m) {
|
||||
|
||||
assert(m->n_on_console > 0);
|
||||
m->n_on_console--;
|
||||
|
||||
if (m->n_on_console == 0)
|
||||
m->no_console_output = false; /* unset no_console_output flag, since the console is definitely free now */
|
||||
}
|
||||
|
||||
static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
|
||||
[MANAGER_INITIALIZING] = "initializing",
|
||||
[MANAGER_STARTING] = "starting",
|
||||
|
||||
Reference in New Issue
Block a user