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> | ||||
|       <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> | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tanu Kaskinen
						Tanu Kaskinen