summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon TURNEY <jon.turney@dronecode.org.uk>2012-07-21 14:13:37 +0100
committerJon TURNEY <jon.turney@dronecode.org.uk>2012-08-03 22:48:09 +0100
commit45c432871d6a244e9e558a6a4e7c36e90764135e (patch)
tree2d23f838d6e115f2254dbebdbd59022e06496e22
parent23cd4d0174194e10721d2e465fd1a1c52f001520 (diff)
hw/xwin: Introduce winProcessXEventsTimeout() to the concept of fractions of a second
Oh this is terrible. Currently we only compute the select timeout in whole seconds. This means if we have less than 1 second remaining, we select with a timeout of 0 (i.e. poll) which causes the task to spin, burning 100% CPU for the remaining timeout (and possibly preventing the process we are waiting for from running :S) Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
-rw-r--r--hw/xwin/winclipboardwndproc.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/hw/xwin/winclipboardwndproc.c b/hw/xwin/winclipboardwndproc.c
index cbe6599f4..e19f678a7 100644
--- a/hw/xwin/winclipboardwndproc.c
+++ b/hw/xwin/winclipboardwndproc.c
@@ -74,10 +74,10 @@ winProcessXEventsTimeout(HWND hwnd, int iWindow, Display * pDisplay,
int iConnNumber;
struct timeval tv;
int iReturn;
- DWORD dwStopTime = (GetTickCount() / 1000) + iTimeoutSec;
+ DWORD dwStopTime = GetTickCount() + iTimeoutSec * 1000;
- /* We need to ensure that all pending events are processed */
- XSync(pDisplay, FALSE);
+ winDebug("winProcessXEventsTimeout () - pumping X events for %d seconds\n",
+ iTimeoutSec);
/* Get our connection number */
iConnNumber = ConnectionNumber(pDisplay);
@@ -85,17 +85,24 @@ winProcessXEventsTimeout(HWND hwnd, int iWindow, Display * pDisplay,
/* Loop for X events */
while (1) {
fd_set fdsRead;
+ long remainingTime;
+
+ /* We need to ensure that all pending events are processed */
+ XSync(pDisplay, FALSE);
/* Setup the file descriptor set */
FD_ZERO(&fdsRead);
FD_SET(iConnNumber, &fdsRead);
/* Adjust timeout */
- tv.tv_sec = dwStopTime - (GetTickCount() / 1000);
- tv.tv_usec = 0;
+ remainingTime = dwStopTime - GetTickCount();
+ tv.tv_sec = remainingTime / 1000;
+ tv.tv_usec = (remainingTime % 1000) * 1000;
+ winDebug("winProcessXEventsTimeout () - %d milliseconds left\n",
+ remainingTime);
/* Break out if no time left */
- if (tv.tv_sec < 0)
+ if (remainingTime <= 0)
return WIN_XEVENTS_SUCCESS;
/* Wait for an X event */
@@ -103,7 +110,7 @@ winProcessXEventsTimeout(HWND hwnd, int iWindow, Display * pDisplay,
&fdsRead, /* Read mask */
NULL, /* No write mask */
NULL, /* No exception mask */
- &tv); /* No timeout */
+ &tv); /* Timeout */
if (iReturn < 0) {
ErrorF("winProcessXEventsTimeout - Call to select () failed: %d. "
"Bailing.\n", iReturn);
@@ -116,11 +123,19 @@ winProcessXEventsTimeout(HWND hwnd, int iWindow, Display * pDisplay,
/* Exit when we see that server is shutting down */
iReturn = winClipboardFlushXEvents(hwnd,
iWindow, pDisplay, fUseUnicode);
+
+ winDebug
+ ("winProcessXEventsTimeout () - winClipboardFlushXEvents returned %d\n",
+ iReturn);
+
if (WIN_XEVENTS_NOTIFY == iReturn) {
/* Bail out if notify processed */
return iReturn;
}
}
+ else {
+ winDebug("winProcessXEventsTimeout - Spurious wake\n");
+ }
}
return WIN_XEVENTS_SUCCESS;