]> source.dussan.org Git - tigervnc.git/commitdiff
Timers in RFB still weren't working properly. Do this right and check the next
authorPierre Ossman <ossman@cendio.se>
Mon, 7 Nov 2011 12:51:34 +0000 (12:51 +0000)
committerPierre Ossman <ossman@cendio.se>
Mon, 7 Nov 2011 12:51:34 +0000 (12:51 +0000)
timer just before the Xorg select() call.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4770 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/xserver/hw/vnc/XserverDesktop.cc
unix/xserver/hw/vnc/XserverDesktop.h
unix/xserver/hw/vnc/vncExtInit.cc

index 1a2bd79d19264ad0426469977439c3a7bd3beae7..8f50cf9d4d16c83091a7f496cd2f6c6418c60e33 100644 (file)
@@ -1,5 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright 2009 Pierre Ossman for Cendio AB
+ * Copyright 2009-2011 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -509,9 +509,15 @@ void XserverDesktop::add_copied(RegionPtr dst, int dx, int dy)
   }
 }
 
-void XserverDesktop::blockHandler(fd_set* fds)
+static struct timeval XserverDesktopTimeout;
+
+void XserverDesktop::blockHandler(fd_set* fds, OSTimePtr timeout)
 {
   try {
+    int nextTimeout;
+
+    // Add all sockets we want read events for, after purging
+    // any closed sockets.
     if (listener)
       FD_SET(listener->getFd(), fds);
     if (httpListener)
@@ -544,18 +550,31 @@ void XserverDesktop::blockHandler(fd_set* fds)
         }
       }
     }
+
+    // Then check when the next timer will expire.
+    // (this unfortunately also triggers any already expired timers)
+    nextTimeout = server->checkTimeouts();
+    if (nextTimeout > 0) {
+      // No timeout specified? Or later timeout than we need?
+      if ((*timeout == NULL) ||
+          ((*timeout)->tv_sec > (nextTimeout/1000)) ||
+          (((*timeout)->tv_sec == (nextTimeout/1000)) &&
+           ((*timeout)->tv_usec > ((nextTimeout%1000)*1000)))) {
+        XserverDesktopTimeout.tv_sec = nextTimeout/1000;
+        XserverDesktopTimeout.tv_usec = (nextTimeout%1000)*1000;
+        *timeout = &XserverDesktopTimeout;
+      }
+    }
+
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::blockHandler: %s",e.str());
   }
 }
 
-static CARD32 dummyTimerCallback(OsTimerPtr timer, CARD32 now, pointer arg) {
-  return 0;
-}
-
 void XserverDesktop::wakeupHandler(fd_set* fds, int nfds)
 {
   try {
+    // First check for file descriptors with something to do
     if (nfds >= 1) {
 
       if (listener) {
@@ -603,13 +622,9 @@ void XserverDesktop::wakeupHandler(fd_set* fds, int nfds)
       inputDevice->PointerSync();
     }
 
-    int timeout = server->checkTimeouts();
-    if (timeout > 0) {
-      // set a dummy timer just so we are guaranteed be called again next time.
-      dummyTimer = TimerSet(dummyTimer, 0, timeout,
-                            dummyTimerCallback, 0);
-    }
-
+    // Then let the timers do some processing. Rescheduling is done in
+    // blockHandler().
+    server->checkTimeouts();
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::wakeupHandler: %s",e.str());
   }
index af3651171feae4c0a822b2176571b6ac8160d47b..fd0773ca85351b72450bfd1c8f27667f76615228 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009-2011 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -70,7 +71,7 @@ public:
   void add_changed(RegionPtr reg);
   void add_copied(RegionPtr dst, int dx, int dy);
   void ignoreHooks(bool b) { ignoreHooks_ = b; }
-  void blockHandler(fd_set* fds);
+  void blockHandler(fd_set* fds, OSTimePtr timeout);
   void wakeupHandler(fd_set* fds, int nfds);
   void writeBlockHandler(fd_set* fds);
   void writeWakeupHandler(fd_set* fds, int nfds);
index baa8fa4efa563edc544306539736e7425593193b..7d865ed12dd4cde7d037f0498046b2b28220eae3 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2011 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -308,7 +309,7 @@ static void vncBlockHandler(pointer data, OSTimePtr timeout, pointer readmask)
 
   for (int scr = 0; scr < screenInfo.numScreens; scr++)
     if (desktop[scr])
-      desktop[scr]->blockHandler(fds);
+      desktop[scr]->blockHandler(fds, timeout);
 }
 
 static void vncWakeupHandler(pointer data, int nfds, pointer readmask)