Blame SOURCES/pulseaudio-11.1-exit_idle_time-2.patch

e44045
diff -up pulseaudio-11.1/src/modules/module-console-kit.c.foo pulseaudio-11.1/src/modules/module-console-kit.c
e44045
--- pulseaudio-11.1/src/modules/module-console-kit.c.foo	2016-08-23 07:50:10.000000000 -0500
e44045
+++ pulseaudio-11.1/src/modules/module-console-kit.c	2018-02-28 11:01:50.138465311 -0600
e44045
@@ -120,6 +120,19 @@ static void add_session(struct userdata
e44045
 
e44045
     pa_log_debug("Added new session %s", id);
e44045
 
e44045
+    /* Positive exit_idle_time is only useful when we have no session tracking
e44045
+     * capability, so we can set it to 0 now that we have detected a session.
e44045
+     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
e44045
+     * immediately when the session ends. That in turn is useful, because some
e44045
+     * systems (those that use pam_systemd but don't use systemd for managing
e44045
+     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
e44045
+     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
e44045
+     * contains our sockets, and if the sockets are removed without terminating
e44045
+     * pulseaudio, a quick relogin will likely cause trouble, because a new
e44045
+     * instance will be spawned while the old instance is still running. */
e44045
+    if (u->core->exit_idle_time > 0)
e44045
+        pa_core_set_exit_idle_time(u->core, 0);
e44045
+
e44045
 fail:
e44045
 
e44045
     if (m)
e44045
diff -up pulseaudio-11.1/src/modules/module-systemd-login.c.foo pulseaudio-11.1/src/modules/module-systemd-login.c
e44045
--- pulseaudio-11.1/src/modules/module-systemd-login.c.foo	2018-02-28 11:01:50.138465311 -0600
e44045
+++ pulseaudio-11.1/src/modules/module-systemd-login.c	2018-02-28 11:03:06.053396460 -0600
e44045
@@ -86,6 +86,20 @@ static int add_session(struct userdata *
e44045
     pa_hashmap_put(u->sessions, session->id, session);
e44045
 
e44045
     pa_log_debug("Added new session %s", id);
e44045
+
e44045
+    /* Positive exit_idle_time is only useful when we have no session tracking
e44045
+     * capability, so we can set it to 0 now that we have detected a session.
e44045
+     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
e44045
+     * immediately when the session ends. That in turn is useful, because some
e44045
+     * systems (those that use pam_systemd but don't use systemd for managing
e44045
+     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
e44045
+     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
e44045
+     * contains our sockets, and if the sockets are removed without terminating
e44045
+     * pulseaudio, a quick relogin will likely cause trouble, because a new
e44045
+     * instance will be spawned while the old instance is still running. */
e44045
+    if (u->core->exit_idle_time > 0)
e44045
+        pa_core_set_exit_idle_time(u->core, 0);
e44045
+
e44045
     return 0;
e44045
 }
e44045
 
e44045
diff -up pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c.foo pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c
e44045
--- pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c.foo	2016-08-23 07:50:10.000000000 -0500
e44045
+++ pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c	2018-02-28 11:01:50.138465311 -0600
e44045
@@ -208,6 +208,19 @@ int pa__init(pa_module*m) {
e44045
     if (!u->client)
e44045
         goto fail;
e44045
 
e44045
+    /* Positive exit_idle_time is only useful when we have no session tracking
e44045
+     * capability, so we can set it to 0 now that we have detected a session.
e44045
+     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
e44045
+     * immediately when the session ends. That in turn is useful, because some
e44045
+     * systems (those that use pam_systemd but don't use systemd for managing
e44045
+     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
e44045
+     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
e44045
+     * contains our sockets, and if the sockets are removed without terminating
e44045
+     * pulseaudio, a quick relogin will likely cause trouble, because a new
e44045
+     * instance will be spawned while the old instance is still running. */
e44045
+    if (u->core->exit_idle_time > 0)
e44045
+        pa_core_set_exit_idle_time(u->core, 0);
e44045
+
e44045
     pa_modargs_free(ma);
e44045
 
e44045
     return 0;
e44045
diff -up pulseaudio-11.1/src/pulsecore/core.c.foo pulseaudio-11.1/src/pulsecore/core.c
e44045
--- pulseaudio-11.1/src/pulsecore/core.c.foo	2018-02-28 11:01:50.137465298 -0600
e44045
+++ pulseaudio-11.1/src/pulsecore/core.c	2018-02-28 11:01:50.139465323 -0600
e44045
@@ -426,6 +426,16 @@ void pa_core_update_default_source(pa_co
e44045
     pa_hook_fire(&core->hooks[PA_CORE_HOOK_DEFAULT_SOURCE_CHANGED], core->default_source);
e44045
 }
e44045
 
e44045
+void pa_core_set_exit_idle_time(pa_core *core, int time) {
e44045
+    pa_assert(core);
e44045
+
e44045
+    if (time == core->exit_idle_time)
e44045
+        return;
e44045
+
e44045
+    pa_log_info("exit_idle_time: %i -> %i", core->exit_idle_time, time);
e44045
+    core->exit_idle_time = time;
e44045
+}
e44045
+
e44045
 static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
e44045
     pa_core *c = userdata;
e44045
     pa_assert(c->exit_event == e);
e44045
diff -up pulseaudio-11.1/src/pulsecore/core.h.foo pulseaudio-11.1/src/pulsecore/core.h
e44045
--- pulseaudio-11.1/src/pulsecore/core.h.foo	2018-02-28 11:01:50.120465090 -0600
e44045
+++ pulseaudio-11.1/src/pulsecore/core.h	2018-02-28 11:01:50.139465323 -0600
e44045
@@ -255,6 +255,8 @@ void pa_core_set_configured_default_sour
e44045
 void pa_core_update_default_sink(pa_core *core);
e44045
 void pa_core_update_default_source(pa_core *core);
e44045
 
e44045
+void pa_core_set_exit_idle_time(pa_core *core, int time);
e44045
+
e44045
 /* Check whether no one is connected to this core */
e44045
 void pa_core_check_idle(pa_core *c);
e44045