diff options
Diffstat (limited to 'unix/xserver/hw/vnc/XserverDesktop.cc')
-rw-r--r-- | unix/xserver/hw/vnc/XserverDesktop.cc | 41 |
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()); } |