Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion cinnamon-session/csm-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ struct CsmManagerPrivate

ca_context *ca;
gboolean logout_sound_is_playing;

gboolean is_quitting;
};

enum {
Expand Down Expand Up @@ -486,6 +486,12 @@ csm_manager_quit (CsmManager *manager)
/* See the comment in request_reboot() for some more details about how
* this works. */

if (manager->priv->is_quitting) {
g_debug ("CsmManager: quit already in progress, ignoring re-entry");
return;
}
manager->priv->is_quitting = TRUE;

csm_store_clear (manager->priv->inhibitors);

switch (manager->priv->logout_type) {
Expand Down Expand Up @@ -636,6 +642,13 @@ app_died (CsmApp *app,
{
g_warning ("Application '%s' killed by signal %d", csm_app_peek_app_id (app), signal);

/* Do not restart apps when the session is ending or quitting */
if (manager->priv->phase >= CSM_MANAGER_PHASE_END_SESSION || manager->priv->is_quitting) {
g_debug ("Component '%s' died during session shutdown, ignoring",
csm_app_peek_app_id (app));
return;
}

if (csm_app_peek_autorestart (app)) {
g_debug ("Component '%s' is autorestart, ignoring died signal",
csm_app_peek_app_id (app));
Expand All @@ -661,6 +674,13 @@ app_exited (CsmApp *app,
{
g_debug ("App %s exited with %d", csm_app_peek_app_id (app), exit_code);

/* Do not restart apps when the session is ending or quitting */
if (manager->priv->phase >= CSM_MANAGER_PHASE_END_SESSION || manager->priv->is_quitting) {
g_debug ("Component '%s' exited during session shutdown, ignoring",
csm_app_peek_app_id (app));
return;
}

/* Consider that non-success exit status means "crash" for required components */
if (exit_code != 0 && is_app_required (manager, app)) {
if (csm_app_peek_autorestart (app)) {
Expand Down Expand Up @@ -3815,6 +3835,11 @@ request_reboot (CsmManager *manager)
{
g_debug ("CsmManager: requesting reboot");

if (manager->priv->phase >= CSM_MANAGER_PHASE_QUERY_END_SESSION || manager->priv->is_quitting) {
g_debug ("CsmManager: shutdown/logout already in progress, ignoring reboot request");
return;
}

/* FIXME: We need to support a more structured shutdown here,
* but that's blocking on an improved ConsoleKit api.
*
Expand All @@ -3829,6 +3854,11 @@ request_shutdown (CsmManager *manager)
{
g_debug ("CsmManager: requesting shutdown");

if (manager->priv->phase >= CSM_MANAGER_PHASE_QUERY_END_SESSION || manager->priv->is_quitting) {
g_debug ("CsmManager: shutdown/logout already in progress, ignoring shutdown request");
return;
}

/* See the comment in request_reboot() for some more details about
* what work needs to be done here. */
manager->priv->logout_type = CSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT;
Expand Down Expand Up @@ -3868,6 +3898,11 @@ request_logout (CsmManager *manager,
{
g_debug ("CsmManager: requesting logout");

if (manager->priv->phase >= CSM_MANAGER_PHASE_QUERY_END_SESSION || manager->priv->is_quitting) {
g_debug ("CsmManager: shutdown/logout already in progress, ignoring logout request");
return;
}

manager->priv->logout_mode = mode;
manager->priv->logout_type = CSM_MANAGER_LOGOUT_LOGOUT;

Expand Down
12 changes: 8 additions & 4 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,14 @@ conf.set('HAVE_LOGIND', logind.found())
systemd_opt = get_option('systemd')
systemd_dep = dependency('systemd', required: systemd_opt.enabled())
if systemd_dep.found()
systemduserunitdir = systemd_dep.get_variable(
pkgconfig: 'systemduserunitdir',
default_value: join_paths(get_option('prefix'), 'lib', 'systemd', 'user')
)
if get_option('prefix') != '/usr'
systemduserunitdir = join_paths(get_option('prefix'), 'lib', 'systemd', 'user')
else
systemduserunitdir = systemd_dep.get_variable(
pkgconfig: 'systemduserunitdir',
default_value: join_paths(get_option('prefix'), 'lib', 'systemd', 'user')
)
endif
enable_systemd = true
else
enable_systemd = systemd_dep.found() and not systemd_opt.disabled()
Expand Down