Fixed unreasonably high CPU utilization in cases when new connection has
been accepted but polling was not activated yet.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2182 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/unix/x0vncserver/PollingScheduler.cxx b/unix/x0vncserver/PollingScheduler.cxx
index c9d8d60..65420ff 100644
--- a/unix/x0vncserver/PollingScheduler.cxx
+++ b/unix/x0vncserver/PollingScheduler.cxx
@@ -55,6 +55,11 @@
m_initialState = true;
}
+bool PollingScheduler::isRunning()
+{
+ return !m_initialState;
+}
+
void PollingScheduler::newPass()
{
TimeMillis timeNow;
diff --git a/unix/x0vncserver/PollingScheduler.h b/unix/x0vncserver/PollingScheduler.h
index 2e3e5be..2bf5a49 100644
--- a/unix/x0vncserver/PollingScheduler.h
+++ b/unix/x0vncserver/PollingScheduler.h
@@ -41,6 +41,9 @@
// Reset the object into the initial state (no polling performed).
void reset();
+ // Check if the object is active (not in the initial state).
+ bool isRunning();
+
// Tell the scheduler that new polling pass is just being started.
void newPass();
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index 48be662..78e1cc0 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -513,7 +513,10 @@
}
}
- if (clients_connected) {
+ if (!clients_connected)
+ sched.reset();
+
+ if (sched.isRunning()) {
int wait_ms = sched.millisRemaining();
if (wait_ms > 500) {
wait_ms = 500;
@@ -523,7 +526,6 @@
// fprintf(stderr, "[%d]\t", wait_ms);
#endif
} else {
- sched.reset();
tv.tv_usec = 100000;
}
tv.tv_sec = 0;