diff options
author | Mihai Moldovan <ïonic@ionic.de> | 2016-06-17 01:45:40 +0000 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2016-06-21 04:06:27 +0200 |
commit | 4d6d3c56706e0c5a0725c13356c28d3655f72cac (patch) | |
tree | bc82daeb0090eea8dc7eb977cc82a3ed47284262 | |
parent | 04d2fe3aef464560de16d5b15ed91f8d63c6fb09 (diff) | |
download | nx-libs-4d6d3c56706e0c5a0725c13356c28d3655f72cac.tar.gz nx-libs-4d6d3c56706e0c5a0725c13356c28d3655f72cac.tar.bz2 nx-libs-4d6d3c56706e0c5a0725c13356c28d3655f72cac.zip |
{nx-X11/programs/Xserver/hw/nxagent/{{Args,Handlers,Image,Options}.c,Options.h},nxcomp/{Loop,Misc}.cpp}: add configurable sleep delay if session is suspended.
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Args.c | 38 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Handlers.c | 46 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Image.c | 14 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Options.c | 2 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Options.h | 7 | ||||
-rw-r--r-- | nxcomp/Loop.cpp | 3 | ||||
-rw-r--r-- | nxcomp/Misc.cpp | 3 |
7 files changed, 87 insertions, 26 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 59d3deb63..2590dd6c3 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1339,6 +1339,44 @@ static void nxagentParseOptions(char *name, char *value) nxagentChangeOption(Clipboard, ClipboardBoth); } } + else if (!strcmp(name, "sleep")) + { + long sleep_parse = 0; + + errno = 0; + sleep_parse = strtol(value, NULL, 10); + + if ((errno) && (0 == sleep_parse)) + { + fprintf(stderr, "nxagentParseOptions: Unable to convert value [%s] of option [%s]. " + "Ignoring option.\n", + validateString(value), validateString(name)); + + return; + } + + if ((long) UINT_MAX < sleep_parse) + { + sleep_parse = UINT_MAX; + + fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] " + "out of range, clamped to [%u].\n", + validateString(value), validateString(name), sleep_parse); + } + + if (0 > sleep_parse) + { + sleep_parse = 0; + + fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] " + "out of range, clamped to [%u].\n", + validateString(value), validateString(name), sleep_parse); + } + + nxagentChangeOption(SleepTime, sleep_parse); + + return; + } else { #ifdef DEBUG diff --git a/nx-X11/programs/Xserver/hw/nxagent/Handlers.c b/nx-X11/programs/Xserver/hw/nxagent/Handlers.c index 1beff090b..ba4034255 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Handlers.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Handlers.c @@ -63,14 +63,6 @@ #define FLUSH_AFTER_MULTIPLE_READS /* - * Introduce a small delay after each - * loop if the session is down. The - * value is in milliseconds. - */ - -#define LOOP_DELAY_IF_DOWN 50 - -/* * The soft limit should roughly match * the size of the Xlib I/O buffer. */ @@ -246,12 +238,21 @@ void nxagentBlockHandler(void * data, struct timeval **timeout, void * mask) * not connected to a valid display. */ - if (NXDisplayError(nxagentDisplay) == 1 && nxagentShadowCounter == 0) + if (NXDisplayError(nxagentDisplay) == 1 && nxagentShadowCounter == 0 && nxagentOption(SleepTime) > 0) { - usleep(LOOP_DELAY_IF_DOWN * 1000); +#ifdef TEST + fprintf(stderr, "nxagentBlockHandler: sleeping for %d milliseconds for slowdown.\n", + nxagentOption(SleepTime)); +#endif + usleep(nxagentOption(SleepTime) * 1000); now = GetTimeInMillis(); } +#ifdef TEST + else if (0 == nxagentOption(SleepTime)) { + fprintf(stderr, "nxagentBlockHandler: not sleeping for slowdown.\n"); + } +#endif /* * Update the shadow display. This is @@ -743,9 +744,17 @@ void nxagentShadowBlockHandler(void * data, struct timeval **timeout, void * mas nxagentHandleConnectionChanges(); } - if (nxagentSessionState == SESSION_DOWN) + if (nxagentSessionState == SESSION_DOWN && nxagentOption(SleepTime) > 0) { - usleep(50 * 1000); +#ifdef TEST + fprintf(stderr, "nxagentBlockHandler: sleeping for %d milliseconds for slowdown.\n", + nxagentOption(SleepTime)); +#endif + usleep(nxagentOption(SleepTime) * 1000); + } +#ifdef TEST + else if (0 == nxagentOption(SleepTime)) { + fprintf(stderr, "nxagentBlockHandler: not sleeping for slowdown.\n"); } #ifndef __CYGWIN32__ @@ -826,7 +835,18 @@ FIXME: Must queue multiple writes and handle #ifdef __CYGWIN32__ - usleep(50 * 1000); + if (nxagentOption(SleepTime) > 0) { +#ifdef TEST + fprintf(stderr, "nxagentShadowBlockHandler: sleeping for %d milliseconds for slowdown.\n", + nxagentOption(SleepTime)); +#endif + usleep(nxagentOption(SleepTime) * 1000); + } +#ifdef TEST + else if (0 == nxagentOption(SleepTime)) { + fprintf(stderr, "nxagentShadowBlockHandler: not sleeping for slowdown.\n"); + } +#endif (*timeout) -> tv_sec = 0; (*timeout) -> tv_usec = 50 * 1000; diff --git a/nx-X11/programs/Xserver/hw/nxagent/Image.c b/nx-X11/programs/Xserver/hw/nxagent/Image.c index 6a7d46c35..a158a11db 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Image.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Image.c @@ -69,15 +69,6 @@ #define IMAGE_UNIQUE_RATIO 10 /* - * Introduce a small delay after each image - * operation if the session is down. Value - * is in microseconds and is multiplied by - * the image data size in kilobytes. - */ - -#define IMAGE_DELAY_IF_DOWN 250 - -/* * Preferred pack and split parameters we * got from the NX transport. */ @@ -521,11 +512,12 @@ void nxagentPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, length = nxagentImageLength(dstWidth, dstHeight, format, leftPad, depth); if (nxagentShadowCounter == 0 && - NXDisplayError(nxagentDisplay) == 1) + NXDisplayError(nxagentDisplay) == 1 && + nxagentOption(SleepTime) > 0) { int us; - us = IMAGE_DELAY_IF_DOWN * (length / 1024); + us = nxagentOption(SleepTime) * 4 * (length / 1024); us = (us < 10000 ? 10000 : (us > 1000000 ? 1000000 : us)); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Options.c b/nx-X11/programs/Xserver/hw/nxagent/Options.c index dbe200273..8a3275c64 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Options.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Options.c @@ -156,6 +156,8 @@ void nxagentInitOptions() nxagentOptions.ImageRateLimit = 0; nxagentOptions.Xinerama = 0; + + nxagentOptions.SleepTime = DEFAULT_SLEEP_TIME; } /* diff --git a/nx-X11/programs/Xserver/hw/nxagent/Options.h b/nx-X11/programs/Xserver/hw/nxagent/Options.h index 5bf1597d5..02b886242 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Options.h +++ b/nx-X11/programs/Xserver/hw/nxagent/Options.h @@ -28,6 +28,7 @@ #define UNDEFINED -1 #define COPY_UNLIMITED -1 +#define DEFAULT_SLEEP_TIME 50 extern unsigned int nxagentPrintGeometryFlags; @@ -399,6 +400,12 @@ typedef struct _AgentOptions int Xinerama; + /* + * Sleep delay in microseconds. + */ + + unsigned int SleepTime; + } AgentOptionsRec; typedef AgentOptionsRec *AgentOptionsPtr; diff --git a/nxcomp/Loop.cpp b/nxcomp/Loop.cpp index 473488593..5086db012 100644 --- a/nxcomp/Loop.cpp +++ b/nxcomp/Loop.cpp @@ -9003,7 +9003,8 @@ int ParseEnvironmentOptions(const char *env, int force) strcasecmp(name, "keyboard") == 0 || strcasecmp(name, "clipboard") == 0 || strcasecmp(name, "streaming") == 0 || - strcasecmp(name, "backingstore") == 0) + strcasecmp(name, "backingstore") == 0 || + strcasecmp(name, "sleep") == 0) { #ifdef DEBUG *logofs << "Loop: Ignoring agent option '" << name diff --git a/nxcomp/Misc.cpp b/nxcomp/Misc.cpp index ee73f19d8..05794bded 100644 --- a/nxcomp/Misc.cpp +++ b/nxcomp/Misc.cpp @@ -316,7 +316,8 @@ shadowuid=n\n\ shadowmode=s\n\ defer=n\n\ tile=s\n\ -menu=n These options are interpreted by the NX agent. They\n\ +menu=n\n\ +sleep=n These options are interpreted by the NX agent. They\n\ are ignored by the proxy.\n\ \n\ Environment:\n\ |