]> source.dussan.org Git - tigervnc.git/commitdiff
Ignore socket whilst processing data
authorPierre Ossman <ossman@cendio.se>
Wed, 6 Apr 2022 13:45:36 +0000 (15:45 +0200)
committerPierre Ossman <ossman@cendio.se>
Wed, 6 Apr 2022 13:45:36 +0000 (15:45 +0200)
FLTK has a lot of synchronous stuff (like dialogs), which mean that the
main loop might be run recursively in some cases. If there is data
available on our socket then CConn::socketEvent() will be called
constantly in a busy loop.

Avoid this by removing socket notifications whilst we are processing
data.

vncviewer/CConn.cxx

index b1f97b9810b483306385ca71453fcc95cced4639..011dd971acd28bdc6b0ad03e5546aa26f8e4944b 100644 (file)
@@ -238,10 +238,10 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
   cc = (CConn*)data;
 
   // I don't think processMsg() is recursion safe, so add this check
-  if (recursing)
-    return;
+  assert(!recursing);
 
   recursing = true;
+  Fl::remove_fd(fd);
 
   try {
     // We might have been called to flush unwritten socket data
@@ -287,6 +287,7 @@ void CConn::socketEvent(FL_SOCKET fd, void *data)
   Fl::add_fd(fd, when, socketEvent, data);
 
   recursing = false;
+  Fl::add_fd(fd, FL_READ | FL_EXCEPT, socketEvent, data);
 }
 
 ////////////////////// CConnection callback methods //////////////////////