[mutter/wip/wayland-work: 9/10] display: shortcut get_time_roundtrip() when running as a wayland compositor



commit 00a73c5bdc6f38a36a5d4f1eeb813a6aebe21861
Author: Giovanni Campagna <gcampagn redhat com>
Date:   Wed Sep 4 15:28:27 2013 +0200

    display: shortcut get_time_roundtrip() when running as a wayland compositor
    
    In wayland, we can make some assumptions about the behavior and
    configuration of the X server (which is Xwayland), including on
    the time it uses, and that way avoiding a roundtrip (potentially deadly, if
    by chance the X server is also blocking on us or needs us to flush
    the wayland socket buffer).
    Note that we bypass get_current_time() entirely, as it is assumed
    the function is called always to translated CurrentTime into a real
    value.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=707466

 src/core/display.c |   33 ++++++++++++++++++++-------------
 1 files changed, 20 insertions(+), 13 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index b7a6929..48087a9 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1515,20 +1515,27 @@ guint32
 meta_display_get_current_time_roundtrip (MetaDisplay *display)
 {
   guint32 timestamp;
-  
-  timestamp = meta_display_get_current_time (display);
-  if (timestamp == CurrentTime)
+
+  if (meta_is_wayland_compositor ())
     {
-      XEvent property_event;
-
-      XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
-                       display->atom__MUTTER_TIMESTAMP_PING,
-                       XA_STRING, 8, PropModeAppend, NULL, 0);
-      XIfEvent (display->xdisplay,
-                &property_event,
-                find_timestamp_predicate,
-                (XPointer) display);
-      timestamp = property_event.xproperty.time;
+      timestamp = g_get_monotonic_time () / 1000;
+    }
+  else
+    {
+      timestamp = meta_display_get_current_time (display);
+      if (timestamp == CurrentTime)
+        {
+          XEvent property_event;
+
+          XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
+                           display->atom__MUTTER_TIMESTAMP_PING,
+                           XA_STRING, 8, PropModeAppend, NULL, 0);
+          XIfEvent (display->xdisplay,
+                    &property_event,
+                    find_timestamp_predicate,
+                    (XPointer) display);
+          timestamp = property_event.xproperty.time;
+        }
     }
 
   sanity_check_timestamps (display, timestamp);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]