From 262fe771cceda4a984be603ccb3d8f6563706741 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Wed, 30 Dec 2020 14:36:23 +0100 Subject: Handlers.c: ensure regular yields if suspended Fixes ArcticaProject/nx-libs#903 --- nx-X11/programs/Xserver/hw/nxagent/Handlers.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'nx-X11/programs/Xserver') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Handlers.c b/nx-X11/programs/Xserver/hw/nxagent/Handlers.c index 9f0a3c9d9..62974b9c1 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Handlers.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Handlers.c @@ -1070,7 +1070,28 @@ void nxagentDispatchHandler(ClientPtr client, int in, int out) * into the inner dispatch loop forever. */ - if (!SmartScheduleSignalEnable) + /* + * The behaviour described in the comment above also happens with the + * smart scheduler if all of the following conditions are met: + * - the agent is suspended + * - SleepTimeMillis is set (the default is sufficient to trigger this) + * - a client is doing a lot of image operations + * - nxagentShadowCounter is 0 + * In that case the agent will slow down the image operations by calling + * an intermediate sleep resulting in the client's request queue never + * being empty. Which in turn leads to the drain loop described above. + * isItTimeToYield will then never be set. The (dramatic) result of this + * is that nxagent will not process any signals and therefore cannot be + * resumed anymore! + * For this reason we do not limit below code to the dumb scheduler but also + * run it if above conditions are met - ensuring regular yields. + * See issue #903 + */ + + if (!SmartScheduleSignalEnable || + (nxagentShadowCounter == 0 && + NXDisplayError(nxagentDisplay) == 1 && + nxagentOption(SleepTimeMillis) > 0)) { if (client -> index != nxagentDispatch.client) { -- cgit v1.2.3