[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