On 06.03.2018 14:09, Tanu Kaskinen wrote: > As the comments explain, this fixes relogin problems on some systems > that remove our sockets on logout without terminating the daemon. > --- > > Changes in v2: > - added man page updates > > man/pulse-daemon.conf.5.xml.in | 15 ++++++++++++--- > man/pulseaudio.1.xml.in | 17 +++++++++++++++-- > src/modules/module-console-kit.c | 13 +++++++++++++ > src/modules/module-systemd-login.c | 14 ++++++++++++++ > src/modules/x11/module-x11-xsmp.c | 13 +++++++++++++ > src/pulsecore/core.c | 10 ++++++++++ > src/pulsecore/core.h | 2 ++ > 7 files changed, 79 insertions(+), 5 deletions(-) > > diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in > index f0550f3b1..f49fa9b0a 100644 > --- a/man/pulse-daemon.conf.5.xml.in > +++ b/man/pulse-daemon.conf.5.xml.in > @@ -292,9 +292,18 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. > <option> > <p><opt>exit-idle-time=</opt> Terminate the daemon after the > last client quit and this time in seconds passed. Use a negative value to > - disable this feature. Defaults to 20. The > - <opt>--exit-idle-time</opt> command line option takes > - precedence.</p> > + disable this feature. Defaults to 20. The <opt>--exit-idle-time</opt> > + command line option takes precedence.</p> > + > + <p>When PulseAudio runs in the per-user mode and detects a login > + session, then any positive value will be reset to 0 so that PulseAudio > + will terminate immediately on logout. A positive value therefore has > + effect only in environments where there's no support for login session > + tracking. A negative value can still be used to disable any automatic > + exit.</p> > + > + <p>When PulseAudio runs in the system mode, automatic exit is always > + disabled, so this option does nothing.</p> > </option> > > <option> > diff --git a/man/pulseaudio.1.xml.in b/man/pulseaudio.1.xml.in > index f732b8ae9..824eddb4e 100644 > --- a/man/pulseaudio.1.xml.in > +++ b/man/pulseaudio.1.xml.in > @@ -189,8 +189,21 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. > <option> > <p><opt>--exit-idle-time</opt><arg>=SECS</arg></p> > > - <optdesc><p>Terminate the daemon when idle and the specified > - number of seconds passed.</p></optdesc> > + <optdesc> > + <p>Terminate the daemon after the last client quit and this time in > + seconds passed. Use a negative value to disable this feature. Defaults > + to 20.</p> > + > + <p>When PulseAudio runs in the per-user mode and detects a login > + session, then any positive value will be reset to 0 so that PulseAudio > + will terminate immediately on logout. A positive value therefore has > + effect only in environments where there's no support for login session > + tracking. A negative value can still be used to disable any automatic > + exit.</p> > + > + <p>When PulseAudio runs in the system mode, automatic exit is always > + disabled, so this option does nothing.</p> > + </optdesc> > </option> > > <option> > diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c > index c79388499..c8fe2ed24 100644 > --- a/src/modules/module-console-kit.c > +++ b/src/modules/module-console-kit.c > @@ -118,6 +118,19 @@ static void add_session(struct userdata *u, const char *id) { > > pa_log_debug("Added new session %s", id); > > + /* Positive exit_idle_time is only useful when we have no session tracking > + * capability, so we can set it to 0 now that we have detected a session. > + * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit > + * immediately when the session ends. That in turn is useful, because some > + * systems (those that use pam_systemd but don't use systemd for managing > + * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all > + * services that depend on the files in $XDG_RUNTIME_DIR. The directory > + * contains our sockets, and if the sockets are removed without terminating > + * pulseaudio, a quick relogin will likely cause trouble, because a new > + * instance will be spawned while the old instance is still running. */ > + if (u->core->exit_idle_time > 0) > + pa_core_set_exit_idle_time(u->core, 0); > + > fail: > > if (m) > diff --git a/src/modules/module-systemd-login.c b/src/modules/module-systemd-login.c > index 879815927..51401575a 100644 > --- a/src/modules/module-systemd-login.c > +++ b/src/modules/module-systemd-login.c > @@ -84,6 +84,20 @@ static int add_session(struct userdata *u, const char *id) { > pa_hashmap_put(u->sessions, session->id, session); > > pa_log_debug("Added new session %s", id); > + > + /* Positive exit_idle_time is only useful when we have no session tracking > + * capability, so we can set it to 0 now that we have detected a session. > + * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit > + * immediately when the session ends. That in turn is useful, because some > + * systems (those that use pam_systemd but don't use systemd for managing > + * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all > + * services that depend on the files in $XDG_RUNTIME_DIR. The directory > + * contains our sockets, and if the sockets are removed without terminating > + * pulseaudio, a quick relogin will likely cause trouble, because a new > + * instance will be spawned while the old instance is still running. */ > + if (u->core->exit_idle_time > 0) > + pa_core_set_exit_idle_time(u->core, 0); > + > return 0; > } > > diff --git a/src/modules/x11/module-x11-xsmp.c b/src/modules/x11/module-x11-xsmp.c > index 0238e5167..6f8012372 100644 > --- a/src/modules/x11/module-x11-xsmp.c > +++ b/src/modules/x11/module-x11-xsmp.c > @@ -206,6 +206,19 @@ int pa__init(pa_module*m) { > if (!u->client) > goto fail; > > + /* Positive exit_idle_time is only useful when we have no session tracking > + * capability, so we can set it to 0 now that we have detected a session. > + * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit > + * immediately when the session ends. That in turn is useful, because some > + * systems (those that use pam_systemd but don't use systemd for managing > + * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all > + * services that depend on the files in $XDG_RUNTIME_DIR. The directory > + * contains our sockets, and if the sockets are removed without terminating > + * pulseaudio, a quick relogin will likely cause trouble, because a new > + * instance will be spawned while the old instance is still running. */ > + if (u->core->exit_idle_time > 0) > + pa_core_set_exit_idle_time(u->core, 0); > + > pa_modargs_free(ma); > > return 0; > diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c > index 79abbc044..da42a13e4 100644 > --- a/src/pulsecore/core.c > +++ b/src/pulsecore/core.c > @@ -426,6 +426,16 @@ void pa_core_update_default_source(pa_core *core) { > pa_hook_fire(&core->hooks[PA_CORE_HOOK_DEFAULT_SOURCE_CHANGED], core->default_source); > } > > +void pa_core_set_exit_idle_time(pa_core *core, int time) { > + pa_assert(core); > + > + if (time == core->exit_idle_time) > + return; > + > + pa_log_info("exit_idle_time: %i -> %i", core->exit_idle_time, time); > + core->exit_idle_time = time; > +} > + > static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) { > pa_core *c = userdata; > pa_assert(c->exit_event == e); > diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h > index 213964cec..38622f618 100644 > --- a/src/pulsecore/core.h > +++ b/src/pulsecore/core.h > @@ -258,6 +258,8 @@ void pa_core_set_configured_default_source(pa_core *core, const char *source); > void pa_core_update_default_sink(pa_core *core); > void pa_core_update_default_source(pa_core *core); > > +void pa_core_set_exit_idle_time(pa_core *core, int time); > + > /* Check whether no one is connected to this core */ > void pa_core_check_idle(pa_core *c); > LGTM