]> source.dussan.org Git - tigervnc.git/commitdiff
More robust event and close handling
authorPierre Ossman <ossman@cendio.se>
Thu, 29 Dec 2016 15:52:56 +0000 (16:52 +0100)
committerPierre Ossman <ossman@cendio.se>
Tue, 3 Jan 2017 12:50:32 +0000 (13:50 +0100)
There were still some circumstances where we could get stuck reading
data and not respect close events properly. Move that logic to a more
central place in order to make it more reliable.

vncviewer/CConn.cxx

index 140b1d657821da2a87b47cfc28015b7435362f21..baf01d415a87379d408fb9ec6943faf12108e4ea 100644 (file)
@@ -254,6 +254,15 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
     // until the buffers are empty or things will stall.
     do {
       cc->processMsg();
+
+      // Make sure that the FLTK handling and the timers gets some CPU
+      // time in case of back to back messages
+       Fl::check();
+       Timer::checkTimeouts();
+
+       // Also check if we need to stop reading and terminate
+       if (should_exit())
+         break;
     } while (cc->sock->inStream().checkNoWait(1));
   } catch (rdr::EndOfStream& e) {
     vlog.info("%s", e.str());
@@ -397,11 +406,6 @@ void CConn::framebufferUpdateEnd()
   // Compute new settings based on updated bandwidth values
   if (autoSelect)
     autoSelectFormatAndEncoding();
-
-  // Make sure that the FLTK handling and the timers gets some CPU time
-  // in case of back to back framebuffer updates.
-  Fl::check();
-  Timer::checkTimeouts();
 }
 
 // The rest of the callbacks are fairly self-explanatory...