diff options
author | Ulrich Sibiller <uli42@gmx.de> | 2020-12-30 14:36:23 +0100 |
---|---|---|
committer | Ulrich Sibiller <uli42@gmx.de> | 2020-12-30 16:15:22 +0100 |
commit | e7d5ba4e5a5394633dbd3ce5a3fd5314309bc641 (patch) | |
tree | 9e48812cb1538889067fb72ff23986b472f664fc /nx-X11/programs/Xserver/hw/nxagent | |
parent | ad275d50720fbbaf65bc0668eed0297df5d27cad (diff) | |
download | nx-libs-e7d5ba4e5a5394633dbd3ce5a3fd5314309bc641.tar.gz nx-libs-e7d5ba4e5a5394633dbd3ce5a3fd5314309bc641.tar.bz2 nx-libs-e7d5ba4e5a5394633dbd3ce5a3fd5314309bc641.zip |
Handlers.c: ensure regular yields if suspended
Fixes ArcticaProject/nx-libs#903
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent')
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Handlers.c | 23 |
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) { |