aboutsummaryrefslogtreecommitdiff
path: root/nx-X11
diff options
context:
space:
mode:
authorUlrich Sibiller <uli42@gmx.de>2020-12-30 14:36:23 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2021-01-15 16:38:11 +0100
commit262fe771cceda4a984be603ccb3d8f6563706741 (patch)
treed1cb1dfb5e606f7d089605245bae595cb635213b /nx-X11
parent4eba4f53ad8c62c27c12835e58184d66121ff636 (diff)
downloadnx-libs-262fe771cceda4a984be603ccb3d8f6563706741.tar.gz
nx-libs-262fe771cceda4a984be603ccb3d8f6563706741.tar.bz2
nx-libs-262fe771cceda4a984be603ccb3d8f6563706741.zip
Handlers.c: ensure regular yields if suspended
Fixes ArcticaProject/nx-libs#903
Diffstat (limited to 'nx-X11')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Handlers.c23
1 files changed, 22 insertions, 1 deletions
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)
{