aboutsummaryrefslogtreecommitdiffstats
path: root/unix/xserver/hw/vnc/XserverDesktop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'unix/xserver/hw/vnc/XserverDesktop.cc')
-rw-r--r--unix/xserver/hw/vnc/XserverDesktop.cc41
1 files changed, 28 insertions, 13 deletions
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index 1a2bd79d..8f50cf9d 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -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());
}