xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Wed Jan 11 19:44:01 UTC 2017


 dix/dispatch.c      |   10 ++++++++++
 include/dixstruct.h |    6 ++++++
 os/connection.c     |    4 ++++
 3 files changed, 20 insertions(+)

New commits:
commit 785053d033e73d2deb0ded4b97eabfd881991978
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jan 9 18:10:21 2017 -0800

    AttendClient of grab-pervious client must queue to saved_ready_clients [v2]
    
    A client which is attended while a grab is blocking execution of its
    requests needs to be placed in the saved_ready_clients list so that it
    will get scheduled once the grab terminates. Otherwise, if the client
    never sends another request, there is no way for it to be placed in
    the ready_clients list.
    
    v2: Wrap comment above mark_client_saved_ready.
        Remove test for OS_COMM_IGNORED which will always be true.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99333
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/dix/dispatch.c b/dix/dispatch.c
index 3d0fe26..78ac095 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -266,6 +266,16 @@ mark_client_ready(ClientPtr client)
         xorg_list_append(&client->ready, &ready_clients);
 }
 
+/*
+ * Client has requests queued or data on the network, but awaits a
+ * server grab release
+ */
+void mark_client_saved_ready(ClientPtr client)
+{
+    if (xorg_list_is_empty(&client->ready))
+        xorg_list_append(&client->ready, &saved_ready_clients);
+}
+
 /* Client has no requests queued and no data on network */
 void
 mark_client_not_ready(ClientPtr client)
diff --git a/include/dixstruct.h b/include/dixstruct.h
index d71b0ac..21a6b8a 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -143,6 +143,12 @@ extern void SmartScheduleStopTimer(void);
 /* Client has requests queued or data on the network */
 void mark_client_ready(ClientPtr client);
 
+/*
+ * Client has requests queued or data on the network, but awaits a
+ * server grab release
+ */
+void mark_client_saved_ready(ClientPtr client);
+
 /* Client has no requests queued and no data on network */
 void mark_client_not_ready(ClientPtr client);
 
diff --git a/os/connection.c b/os/connection.c
index a901ebf..62e2980 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -1067,6 +1067,10 @@ AttendClient(ClientPtr client)
     set_poll_client(client);
     if (listen_to_client(client))
         mark_client_ready(client);
+    else {
+        /* grab active, mark ready when grab goes away */
+        mark_client_saved_ready(client);
+    }
 }
 
 /* make client impervious to grabs; assume only executing client calls this */


More information about the xorg-commit mailing list