Date: Tuesday, January 10, 2017 @ 20:43:34 Author: lcarlier Revision: 285640
upgpkg: xorg-server 1.19.0-6 add another upstream patch to fix hangs Modified: xorg-server/trunk/PKGBUILD xorg-server/trunk/git-fixes.diff ----------------+ PKGBUILD | 5 ++-- git-fixes.diff | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2017-01-10 20:03:15 UTC (rev 285639) +++ PKGBUILD 2017-01-10 20:43:34 UTC (rev 285640) @@ -5,7 +5,7 @@ pkgbase=xorg-server pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb' 'xorg-server-xnest' 'xorg-server-xwayland' 'xorg-server-common' 'xorg-server-devel') pkgver=1.19.0 -pkgrel=5 +pkgrel=6 arch=('i686' 'x86_64') license=('custom') groups=('xorg') @@ -28,7 +28,7 @@ 'SKIP' 'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9' '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776' - '15ae819f97b16e88974986d71c832b99fa220e8223ccaf171513e9e4c73f84dd') + 'f0f18685a5894a4d30669fa0b74db8f29d869b57315d8a16e093010659a3299c') prepare() { cd "${pkgbase}-${pkgver}" @@ -37,6 +37,7 @@ # os: return 0 from check_timers if we touched any of them # glamor: Trust eglGetPlatformDisplayEXT if it exists # present: Only call present_flip_notify if vblank->queued == FALSE + # AttendClient of grab-pervious client should queue to saved_ready_clients patch -Np1 -i ../git-fixes.diff } Modified: git-fixes.diff =================================================================== --- git-fixes.diff 2017-01-10 20:03:15 UTC (rev 285639) +++ git-fixes.diff 2017-01-10 20:43:34 UTC (rev 285640) @@ -652,3 +652,71 @@ -- cgit v0.10.2 +From: Keith Packard <kei...@keithp.com> +X-Patchwork-Id: 132089 +Message-Id: <20170110021441.12759-1-kei...@keithp.com> +To: xorg-de...@lists.freedesktop.org +Date: Mon, 9 Jan 2017 18:14:41 -0800 + +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. + +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99333 +Signed-off-by: Keith Packard <kei...@keithp.com> +--- + dix/dispatch.c | 7 +++++++ + include/dixstruct.h | 3 +++ + os/connection.c | 4 ++++ + 3 files changed, 14 insertions(+) + +diff --git a/dix/dispatch.c b/dix/dispatch.c +index 3d0fe26fd..ab69d34b9 100644 +--- a/dix/dispatch.c ++++ b/dix/dispatch.c +@@ -266,6 +266,13 @@ 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..a2629c8a2 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 if (!(oc->flags & OS_COMM_IGNORED)) { ++ /* grab active, mark ready when grab goes away */ ++ mark_client_saved_ready(client); ++ } + } + + /* make client impervious to grabs; assume only executing client calls this */ +