]> source.dussan.org Git - tigervnc.git/commitdiff
New PollingScheduler class for calculating timeouts for select() and
authorConstantin Kaplinsky <const@tightvnc.com>
Thu, 16 Feb 2006 14:51:11 +0000 (14:51 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Thu, 16 Feb 2006 14:51:11 +0000 (14:51 +0000)
moments when next polling pass should be started. Current
implementation does not change scheduling algorithm used in previous
versions, so this change is just a code refactoring to prepare for
ongoing improvements.

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

x0vncserver/Makefile.in
x0vncserver/PollingScheduler.cxx [new file with mode: 0644]
x0vncserver/PollingScheduler.h [new file with mode: 0644]
x0vncserver/x0vncserver.cxx

index 4227a5187b33748530da573de7643393d7deae6a..f9a2ad76a0367904cead55eb62cb3251cc4f580b 100644 (file)
@@ -1,6 +1,6 @@
 
 SRCS = Image.cxx CPUMonitor.cxx TimeMillis.cxx PollingManager.cxx \
-       x0vncserver.cxx
+       PollingScheduler.cxx x0vncserver.cxx
 
 OBJS = $(SRCS:.cxx=.o)
 
diff --git a/x0vncserver/PollingScheduler.cxx b/x0vncserver/PollingScheduler.cxx
new file mode 100644 (file)
index 0000000..2d28491
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (C) 2006 Constantin Kaplinsky.  All Rights Reserved.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+//
+// PollingScheduler.cxx
+//
+
+#include <x0vncserver/PollingScheduler.h>
+
+PollingScheduler::PollingScheduler(int interval)
+{
+  setInterval(interval);
+  reset();
+}
+
+void PollingScheduler::setInterval(int interval)
+{
+  m_interval = interval;
+}
+
+void PollingScheduler::reset()
+{
+  initialState = true;
+}
+
+void PollingScheduler::newPass()
+{
+  m_passStarted.update();
+  initialState = false;
+}
+
+int PollingScheduler::millisRemaining() const
+{
+  if (initialState)
+    return 0;
+
+  TimeMillis timeNow;
+  int elapsed = timeNow.diffFrom(m_passStarted);
+
+  if (elapsed > m_interval)
+    return 0;
+
+  return (m_interval - elapsed);
+}
+
diff --git a/x0vncserver/PollingScheduler.h b/x0vncserver/PollingScheduler.h
new file mode 100644 (file)
index 0000000..777a665
--- /dev/null
@@ -0,0 +1,55 @@
+/* Copyright (C) 2006 Constantin Kaplinsky.  All Rights Reserved.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+//
+// PollingScheduler.h
+//
+
+#ifndef __POLLINGSCHEDULER_H__
+#define __POLLINGSCHEDULER_H__
+
+#include <x0vncserver/TimeMillis.h>
+
+class PollingScheduler {
+
+public:
+
+  PollingScheduler(int interval);
+
+  // Set desired polling interval.
+  void setInterval(int interval);
+
+  // Reset the object into the initial state (no polling performed).
+  void reset();
+
+  // Tell the scheduler that new polling pass is just being started.
+  void newPass();
+
+  // This function estimates time remaining before new polling pass.
+  int millisRemaining() const;
+
+protected:
+
+  bool initialState;
+  int m_interval;
+  TimeMillis m_passStarted;
+
+};
+
+#endif // __POLLINGSCHEDULER_H__
+
index af63ad00e0ab82a460489bccb8c7d6ad861f7ee9..27c130a42f3f5b331d6094e05e896d5a76b1f8f3 100644 (file)
@@ -44,7 +44,7 @@
 #include <x0vncserver/Image.h>
 #include <x0vncserver/PollingManager.h>
 #include <x0vncserver/CPUMonitor.h>
-#include <x0vncserver/TimeMillis.h>
+#include <x0vncserver/PollingScheduler.h>
 
 using namespace rfb;
 using namespace network;
@@ -417,8 +417,8 @@ int main(int argc, char** argv)
 
     CPUMonitor cpumon((int)maxProcessorUsage, 1000);
     int dynPollingCycle = (int)pollingCycle;
+    PollingScheduler sched(dynPollingCycle);
 
-    TimeMillis timeSaved, timeNow;
     fd_set rfds;
     struct timeval tv;
 
@@ -437,14 +437,8 @@ int main(int argc, char** argv)
       }
 
       if (clients_connected) {
-        int poll_ms = 20;
-        if (timeNow.update()) {
-          poll_ms = timeNow.diffFrom(timeSaved);
-        }
-        int wait_ms = dynPollingCycle - poll_ms;
-        if (wait_ms < 0) {
-          wait_ms = 0;
-        } else if (wait_ms > 500) {
+        int wait_ms = sched.millisRemaining();
+        if (wait_ms > 500) {
           wait_ms = 500;
         }
         tv.tv_usec = wait_ms * 1000;
@@ -452,7 +446,8 @@ int main(int argc, char** argv)
         fprintf(stderr, "[%d]\t", wait_ms);
 #endif
       } else {
-        tv.tv_usec = 50000;
+        sched.reset();
+        tv.tv_usec = 100000;
       }
       tv.tv_sec = 0;
 
@@ -490,16 +485,10 @@ int main(int argc, char** argv)
 
       server.checkTimeouts();
 
-      if (timeNow.update()) {
-        int diff = timeNow.diffFrom(timeSaved);
-        if (diff >= dynPollingCycle) {
-          adjustPollingCycle(&dynPollingCycle, &cpumon);
-          timeSaved = timeNow;
-          desktop.poll();
-        }
-      } else {
-        // Something strange has happened -- TimeMillis::update() failed.
-        // Poll after each select(), as in the original VNC4 code.
+      if (sched.millisRemaining() <= 0) {
+        adjustPollingCycle(&dynPollingCycle, &cpumon);
+        sched.setInterval(dynPollingCycle);
+        sched.newPass();
         desktop.poll();
       }
     }