]> source.dussan.org Git - tigervnc.git/commitdiff
Asynchronously retry update on congestion
authorPierre Ossman <ossman@cendio.se>
Fri, 29 Apr 2016 13:35:56 +0000 (15:35 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 29 Apr 2016 13:35:56 +0000 (15:35 +0200)
We now get notifications when the output buffer empties, and we
already caught incoming RTT pongs, meaning we can now react at the
proper time to retry a congested update rather than use a timer.

common/rfb/VNCSConnectionST.cxx
common/rfb/VNCSConnectionST.h

index 0f4ca94204b6e3602d9d5da3484ce5e5fe9e08fe..3a072ef04424cd8927b7ec4e410f68cd9731dc29 100644 (file)
@@ -75,8 +75,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
     pingCounter(0), congestionTimer(this),
     server(server_), updates(false),
     updateRenderedCursor(false), removeRenderedCursor(false),
-    continuousUpdates(false), encodeManager(this),
-    updateTimer(this), pointerEventTime(0),
+    continuousUpdates(false), encodeManager(this), pointerEventTime(0),
     accessRights(AccessDefault), startTime(time(0))
 {
   setStreams(&sock->inStream(), &sock->outStream());
@@ -196,6 +195,10 @@ void VNCSConnectionST::flushSocket()
   try {
     setSocketTimeouts();
     sock->outStream().flush();
+    // Flushing the socket might release an update that was previously
+    // delayed because of congestion.
+    if (sock->outStream().bufferUsage() == 0)
+      writeFramebufferUpdate();
   } catch (rdr::Exception &e) {
     close(e.str());
   }
@@ -741,9 +744,7 @@ void VNCSConnectionST::supportsContinuousUpdates()
 bool VNCSConnectionST::handleTimeout(Timer* t)
 {
   try {
-    if (t == &updateTimer)
-      writeFramebufferUpdate();
-    else if (t == &congestionTimer)
+    if (t == &congestionTimer)
       updateCongestion();
     else if (t == &queryConnectTimer) {
       if (state() == RFBSTATE_QUERYING)
@@ -939,8 +940,6 @@ void VNCSConnectionST::writeFramebufferUpdate()
   bool needNewUpdateInfo;
   bool drawRenderedCursor;
 
-  updateTimer.stop();
-
   // We're in the middle of processing a command that's supposed to be
   // synchronised. Allowing an update to slip out right now might violate
   // that synchronisation.
@@ -960,10 +959,8 @@ void VNCSConnectionST::writeFramebufferUpdate()
 
   // Check that we actually have some space on the link and retry in a
   // bit if things are congested.
-  if (isCongested()) {
-    updateTimer.start(50);
+  if (isCongested())
     return;
-  }
 
   // In continuous mode, we will be outputting at least three distinct
   // messages. We need to aggregate these in order to not clog up TCP's
index 55b7ca3eedb881af922879aacc5362413b37d137..3f0163a3e91d47f90c2e03a20ecddc88be9dca88 100644 (file)
@@ -205,8 +205,6 @@ namespace rfb {
     Region cuRegion;
     EncodeManager encodeManager;
 
-    Timer updateTimer;
-
     std::set<rdr::U32> pressedKeys;
 
     time_t lastEventTime;