From e01234e84e7e3f0a7b809931ed4df0534ee218cd178578f4b33778baa55c0d94 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 28 Feb 2018 19:14:35 +0000 Subject: [PATCH] Accepting request 581119 from home:tiwai:branches:multimedia:libs - Abort PA process at session exit properly (bsc#1052437): pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch OBS-URL: https://build.opensuse.org/request/show/581119 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/pulseaudio?expand=0&rev=184 --- ...e-time-to-0-when-we-detect-a-session.patch | 113 ++++++++++++++++++ pulseaudio.changes | 6 + pulseaudio.spec | 2 + 3 files changed, 121 insertions(+) create mode 100644 pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch diff --git a/pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch b/pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch new file mode 100644 index 0000000..6e350bf --- /dev/null +++ b/pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch @@ -0,0 +1,113 @@ +From: Tanu Kaskinen +Subject: [PATCH] set exit-idle-time to 0 when we detect a session +Date: Wed, 28 Feb 2018 18:16:03 +0200 +Message-Id: <20180228161603.30746-1-tanuk@iki.fi> + +As the comments explain, this fixes relogin problems on some systems +that remove our sockets on logout without terminating the daemon. +--- + + 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 ++ + 5 files changed, 52 insertions(+) + +--- a/src/modules/module-console-kit.c ++++ b/src/modules/module-console-kit.c +@@ -120,6 +120,19 @@ static void add_session(struct userdata + + 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) +--- a/src/modules/module-systemd-login.c ++++ b/src/modules/module-systemd-login.c +@@ -86,6 +86,20 @@ static int add_session(struct userdata * + 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; + } + +--- a/src/modules/x11/module-x11-xsmp.c ++++ b/src/modules/x11/module-x11-xsmp.c +@@ -208,6 +208,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; +--- a/src/pulsecore/core.c ++++ b/src/pulsecore/core.c +@@ -426,6 +426,16 @@ void pa_core_update_default_source(pa_co + 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); +--- a/src/pulsecore/core.h ++++ b/src/pulsecore/core.h +@@ -254,6 +254,8 @@ void pa_core_set_configured_default_sour + 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); + diff --git a/pulseaudio.changes b/pulseaudio.changes index d7d7e9e..98a6a79 100644 --- a/pulseaudio.changes +++ b/pulseaudio.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Feb 28 17:23:25 CET 2018 - tiwai@suse.de + +- Abort PA process at session exit properly (bsc#1052437): + pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch + ------------------------------------------------------------------- Thu Feb 15 12:50:59 UTC 2018 - dimstar@opensuse.org diff --git a/pulseaudio.spec b/pulseaudio.spec index 833d1a4..df17090 100644 --- a/pulseaudio.spec +++ b/pulseaudio.spec @@ -51,6 +51,7 @@ Patch1: suppress-socket-error-msg.diff Patch2: pulseaudio-wrong-memset.patch # PATCH-FIX-UPSTREAM pulseaudio-glibc2.27.patch boo#1081023 fdo#104733 dimstar@opensuse.org -- Fix build with glibc 2.27 Patch3: pulseaudio-glibc2.27.patch +Patch4: pa-set-exit-idle-time-to-0-when-we-detect-a-session.patch BuildRequires: alsa-devel >= 1.0.19 # require only minimal bluez, if we are on bluez 5 we will determine in build phase BuildRequires: bluez-devel >= 4.99 @@ -330,6 +331,7 @@ Optional dependency offering zsh completion for various PulseAudio utilities %patch1 -p1 %patch2 %patch3 -p1 +%patch4 -p1 %build ./bootstrap.sh