mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
set exit_idle_time to 0 when we detect a session
As the comments explain, this fixes relogin problems on some systems that remove our sockets on logout without terminating the daemon.
This commit is contained in:
parent
83675b3745
commit
de705a0eea
7 changed files with 79 additions and 5 deletions
|
|
@ -292,9 +292,18 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>exit-idle-time=</opt> Terminate the daemon after the
|
<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
|
last client quit and this time in seconds passed. Use a negative value to
|
||||||
disable this feature. Defaults to 20. The
|
disable this feature. Defaults to 20. The <opt>--exit-idle-time</opt>
|
||||||
<opt>--exit-idle-time</opt> command line option takes
|
command line option takes precedence.</p>
|
||||||
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>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
|
||||||
|
|
@ -189,8 +189,21 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>--exit-idle-time</opt><arg>=SECS</arg></p>
|
<p><opt>--exit-idle-time</opt><arg>=SECS</arg></p>
|
||||||
|
|
||||||
<optdesc><p>Terminate the daemon when idle and the specified
|
<optdesc>
|
||||||
number of seconds passed.</p></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>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,19 @@ static void add_session(struct userdata *u, const char *id) {
|
||||||
|
|
||||||
pa_log_debug("Added new session %s", 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:
|
fail:
|
||||||
|
|
||||||
if (m)
|
if (m)
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,20 @@ static int add_session(struct userdata *u, const char *id) {
|
||||||
pa_hashmap_put(u->sessions, session->id, session);
|
pa_hashmap_put(u->sessions, session->id, session);
|
||||||
|
|
||||||
pa_log_debug("Added new session %s", 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);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,19 @@ int pa__init(pa_module*m) {
|
||||||
if (!u->client)
|
if (!u->client)
|
||||||
goto fail;
|
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);
|
pa_modargs_free(ma);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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) {
|
static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||||
pa_core *c = userdata;
|
pa_core *c = userdata;
|
||||||
pa_assert(c->exit_event == e);
|
pa_assert(c->exit_event == e);
|
||||||
|
|
|
||||||
|
|
@ -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_sink(pa_core *core);
|
||||||
void pa_core_update_default_source(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 */
|
/* Check whether no one is connected to this core */
|
||||||
void pa_core_check_idle(pa_core *c);
|
void pa_core_check_idle(pa_core *c);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue