SRCS = Image.cxx CPUMonitor.cxx TimeMillis.cxx PollingManager.cxx \
- x0vncserver.cxx
+ PollingScheduler.cxx x0vncserver.cxx
OBJS = $(SRCS:.cxx=.o)
--- /dev/null
+/* 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);
+}
+
--- /dev/null
+/* 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__
+
#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;
CPUMonitor cpumon((int)maxProcessorUsage, 1000);
int dynPollingCycle = (int)pollingCycle;
+ PollingScheduler sched(dynPollingCycle);
- TimeMillis timeSaved, timeNow;
fd_set rfds;
struct timeval tv;
}
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;
fprintf(stderr, "[%d]\t", wait_ms);
#endif
} else {
- tv.tv_usec = 50000;
+ sched.reset();
+ tv.tv_usec = 100000;
}
tv.tv_sec = 0;
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();
}
}