[PATCH 08/21] [terminal] don't keep track of active vt, just if vt is active
Scott James Remnant
scott at ubuntu.com
Wed Mar 17 21:29:36 PDT 2010
Trying to keep track of whatever VT is actually active is inherently
racy; instead just keep track of whether our VT is the active one.
Since we guarantee that's the VT in VT_PROCESS now, this is easy.
Rather simplifies the on_vt_changed functions in renderers too.
---
src/libply-splash-core/ply-terminal.c | 38 +++++++++++++++------------
src/libply-splash-core/ply-terminal.h | 2 +-
src/plugins/renderers/drm/plugin.c | 15 +++++-----
src/plugins/renderers/frame-buffer/plugin.c | 12 +++++---
4 files changed, 36 insertions(+), 31 deletions(-)
diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c
index 771f2bc..e0baf2e 100644
--- a/src/libply-splash-core/ply-terminal.c
+++ b/src/libply-splash-core/ply-terminal.c
@@ -65,7 +65,6 @@ struct _ply_terminal
char *name;
int fd;
int vt_number;
- int active_vt;
int next_active_vt;
ply_list_t *vt_change_closures;
@@ -82,6 +81,7 @@ struct _ply_terminal
uint32_t original_term_attributes_saved : 1;
uint32_t supports_text_color : 1;
uint32_t is_open : 1;
+ uint32_t is_active : 1;
uint32_t is_watching_for_vt_changes : 1;
uint32_t should_ignore_mode_changes : 1;
};
@@ -299,15 +299,15 @@ ply_terminal_check_for_vt (ply_terminal_t *terminal)
terminal->vt_number = -1;
}
-static void
-ply_terminal_look_up_active_vt (ply_terminal_t *terminal)
+static int
+get_active_vt (ply_terminal_t *terminal)
{
- struct vt_stat terminal_state = { 0 };
+ struct vt_stat vt_state = { 0 };
- if (ioctl (terminal->fd, VT_GETSTATE, &terminal_state) < 0)
- return;
+ if (ioctl (terminal->fd, VT_GETSTATE, &vt_state) < 0)
+ return -1;
- terminal->active_vt = terminal_state.v_active;
+ return vt_state.v_active;
}
static void
@@ -342,7 +342,7 @@ on_leave_vt (ply_terminal_t *terminal)
terminal->next_active_vt = 0;
}
- ply_terminal_look_up_active_vt (terminal);
+ terminal->is_active = false;
do_active_vt_changed (terminal);
}
@@ -351,7 +351,7 @@ on_enter_vt (ply_terminal_t *terminal)
{
ioctl (terminal->fd, VT_RELDISP, VT_ACKACQ);
- ply_terminal_look_up_active_vt (terminal);
+ terminal->is_active = true;
do_active_vt_changed (terminal);
}
@@ -431,7 +431,6 @@ ply_terminal_open_device (ply_terminal_t *terminal)
terminal);
ply_terminal_check_for_vt (terminal);
- ply_terminal_look_up_active_vt (terminal);
if (!ply_terminal_set_unbuffered_input (terminal))
ply_trace ("terminal '%s' will be line buffered", terminal->name);
@@ -466,6 +465,11 @@ ply_terminal_open (ply_terminal_t *terminal)
if (ply_terminal_is_vt (terminal))
{
ply_terminal_watch_for_vt_changes (terminal);
+
+ if (get_active_vt (terminal) == terminal->vt_number)
+ terminal->is_active = true;
+ else
+ terminal->is_active = false;
}
terminal->is_open = true;
@@ -491,6 +495,12 @@ ply_terminal_is_open (ply_terminal_t *terminal)
return terminal->is_open;
}
+bool
+ply_terminal_is_active (ply_terminal_t *terminal)
+{
+ return terminal->is_active;
+}
+
void
ply_terminal_close (ply_terminal_t *terminal)
{
@@ -671,12 +681,6 @@ ply_terminal_get_vt_number (ply_terminal_t *terminal)
return terminal->vt_number;
}
-int
-ply_terminal_get_active_vt (ply_terminal_t *terminal)
-{
- return terminal->active_vt;
-}
-
static bool
set_active_vt (ply_terminal_t *terminal,
int vt_number)
@@ -697,7 +701,7 @@ ply_terminal_activate_vt (ply_terminal_t *terminal)
if (!ply_terminal_is_vt (terminal))
return false;
- if (terminal->vt_number == terminal->active_vt)
+ if (terminal->is_active)
return true;
if (!set_active_vt (terminal, terminal->vt_number))
diff --git a/src/libply-splash-core/ply-terminal.h b/src/libply-splash-core/ply-terminal.h
index d3ac89b..8ac47c6 100644
--- a/src/libply-splash-core/ply-terminal.h
+++ b/src/libply-splash-core/ply-terminal.h
@@ -62,6 +62,7 @@ bool ply_terminal_open (ply_terminal_t *terminal);
int ply_terminal_get_fd (ply_terminal_t *terminal);
bool ply_terminal_is_vt (ply_terminal_t *terminal);
bool ply_terminal_is_open (ply_terminal_t *terminal);
+bool ply_terminal_is_active (ply_terminal_t *terminal);
void ply_terminal_close (ply_terminal_t *terminal);
void ply_terminal_reset_colors (ply_terminal_t *terminal);
@@ -90,7 +91,6 @@ void ply_terminal_ignore_mode_changes (ply_terminal_t *terminal,
bool should_ignore);
int ply_terminal_get_vt_number (ply_terminal_t *terminal);
-int ply_terminal_get_active_vt (ply_terminal_t *terminal);
bool ply_terminal_activate_vt (ply_terminal_t *terminal);
void ply_terminal_watch_for_active_vt_change (ply_terminal_t *terminal,
diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c
index 549955d..21d727d 100644
--- a/src/plugins/renderers/drm/plugin.c
+++ b/src/plugins/renderers/drm/plugin.c
@@ -404,16 +404,16 @@ deactivate (ply_renderer_backend_t *backend)
static void
on_active_vt_changed (ply_renderer_backend_t *backend)
{
- if (ply_terminal_get_active_vt (backend->terminal) !=
- ply_terminal_get_vt_number (backend->terminal))
+ if (ply_terminal_is_active (backend->terminal))
+ {
+ ply_trace ("activating on vt change");
+ activate (backend);
+ }
+ else
{
ply_trace ("deactivating on vt change");
deactivate (backend);
- return;
}
-
- ply_trace ("activating on vt change");
- activate (backend);
}
static bool
@@ -927,8 +927,7 @@ reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
{
drmModeCrtc *controller;
- if (ply_terminal_get_active_vt (backend->terminal) !=
- ply_terminal_get_vt_number (backend->terminal))
+ if (!ply_terminal_is_active (backend->terminal))
return;
controller = drmModeGetCrtc (backend->device_fd, head->controller_id);
diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c
index 1c0e34b..3152bf7 100644
--- a/src/plugins/renderers/frame-buffer/plugin.c
+++ b/src/plugins/renderers/frame-buffer/plugin.c
@@ -320,14 +320,16 @@ deactivate (ply_renderer_backend_t *backend)
static void
on_active_vt_changed (ply_renderer_backend_t *backend)
{
- if (ply_terminal_get_active_vt (backend->terminal) !=
- ply_terminal_get_vt_number (backend->terminal))
+ if (ply_terminal_is_active (backend->terminal))
{
+ ply_trace ("activating on vt change");
+ activate (backend);
+ }
+ else
+ {
+ ply_trace ("deactivating on vt change");
deactivate (backend);
- return;
}
-
- activate (backend);
}
static bool
--
1.7.0
More information about the plymouth
mailing list