diff options
-rw-r--r-- | .SRCINFO | 2 | ||||
-rw-r--r-- | PKGBUILD | 13 | ||||
-rw-r--r-- | git-fixes.diff | 68 |
3 files changed, 76 insertions, 7 deletions
@@ -1,6 +1,6 @@ pkgbase = xorg-server-dev pkgver = 1.19.0 - pkgrel = 5 + pkgrel = 6 url = http://xorg.freedesktop.org arch = i686 arch = x86_64 @@ -4,7 +4,7 @@ _pkgbase=xorg-server pkgname=('xorg-server-dev' 'xorg-server-xephyr-dev' 'xorg-server-xdmx-dev' 'xorg-server-xvfb-dev' 'xorg-server-xnest-dev' 'xorg-server-xwayland-dev' 'xorg-server-common-dev' 'xorg-server-devel-dev') pkgver=1.19.0 # http://lists.x.org/archives/xorg/2016-November/058437.html -pkgrel=5 # https://git.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/xorg-server&id=09caa03aed32e9d7a8d5322a75b116205ea7affb +pkgrel=6 # https://git.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/xorg-server&id=292ceb303068b172ed985891d686aa45e19398fe arch=('i686' 'x86_64') license=('custom') groups=('xorg') @@ -27,16 +27,17 @@ sha256sums=('149a708b50befc2d5a40b98d45ddd2ebe0beec018e6d0c663c43bad6210e4da3' 'SKIP' 'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9' '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776' - '15ae819f97b16e88974986d71c832b99fa220e8223ccaf171513e9e4c73f84dd') + 'f0f18685a5894a4d30669fa0b74db8f29d869b57315d8a16e093010659a3299c') prepare() { cd "${_pkgbase}-${pkgver}" msg2 "Apply upstream fixes: - Revert \"damage: Make damageRegionProcessPending take a damage not a drawable\" - 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" + - Revert \"damage: Make damageRegionProcessPending take a damage not a drawable\" + - 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 } diff --git a/git-fixes.diff b/git-fixes.diff index d3b5e17753e7..4f9c2521895d 100644 --- a/git-fixes.diff +++ b/git-fixes.diff @@ -652,3 +652,71 @@ index a7ca06e..ef89045 100644 -- cgit v0.10.2 +From: Keith Packard <keithp@keithp.com> +X-Patchwork-Id: 132089 +Message-Id: <20170110021441.12759-1-keithp@keithp.com> +To: xorg-devel@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 <keithp@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 */ + |