* exceptions.cc (CALL_HANDLER_RETRY_INNER): Rename to reflect different

functionality.
(CALL_HANDLER_RETRY_OUTER): New define.
(setup_handler): Add outer loop to signal handler to try harder to deliver the
signal.
* miscfuncs.cc (yield): Drop priority and use SleepEx() to force thread
rescheduling rather than relying on SwitchToThread().
This commit is contained in:
Christopher Faylor
2011-07-06 16:33:30 +00:00
parent fa0b926af9
commit d1204b6378
3 changed files with 68 additions and 45 deletions

View File

@ -235,11 +235,21 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite)
return (ssize_t) tot;
}
/* Try hard to schedule another thread. */
void
yield ()
{
for (int i = 0; i < 3; i++)
SwitchToThread ();
for (int i = 0; i < 2; i++)
{
int prio = GetThreadPriority (GetCurrentThread ());
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
/* MSDN implies that SleepEx(0,...) will force scheduling of other
threads. Unlike SwitchToThread() the documentation does not mention
other cpus so, presumably (hah!), this + using a lower priority will
stall this thread temporarily and cause another to run. */
SleepEx (0, false);
SetThreadPriority (GetCurrentThread (), prio);
}
}
/* Get a default value for the nice factor. When changing these values,