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>
This commit is contained in:
parent
23cd4d0174
commit
45c432871d
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue