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:
Tanu Kaskinen 2018-03-06 15:09:06 +02:00 committed by Arun Raghavan
parent 83675b3745
commit de705a0eea
7 changed files with 79 additions and 5 deletions

View file

@ -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)

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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);