Adam Jackson <[email protected]> writes:

> 80 columns max, please.

Wrapped.

> The conditional is always true, which makes me wonder what conditional
> you meant to write instead.

Good catch; I was just reading the cases where listen_to_client could
return FALSE and yet the client should not be marked ready, and not
looking at the line in AttendClient which was zeroing the COMM_IGNORED
bit.

Here's a second version:

From 501d68e3b399b038528c3b37d7c81008d6744d8d Mon Sep 17 00:00:00 2001
From: Keith Packard <[email protected]>
Date: Mon, 9 Jan 2017 18:10:21 -0800
Subject: [PATCH xserver] AttendClient of grab-pervious client should 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
Signed-off-by: Keith Packard <[email protected]>
---
 dix/dispatch.c      | 10 ++++++++++
 include/dixstruct.h |  3 +++
 os/connection.c     |  4 ++++
 3 files changed, 17 insertions(+)

diff --git a/dix/dispatch.c b/dix/dispatch.c
index 3d0fe26fd..78ac095b1 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 d71b0ac05..fd9195972 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -143,6 +143,9 @@ 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 a901ebf3c..62e298072 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 */
-- 
2.11.0


-- 
-keith

Attachment: signature.asc
Description: PGP signature

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to