* miscfuncs.cc (yield): Revert (after researching) to calling SleepEx with 0.

We don't want to actually sleep when calling this function.
This commit is contained in:
Christopher Faylor 2013-06-08 16:39:52 +00:00
parent 1eaf9215cb
commit 1952976a1b
2 changed files with 16 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2013-06-08 Christopher Faylor <me.cygwin2013@cgf.cx>
* miscfuncs.cc (yield): Revert (after researching) to calling SleepEx
with 0. We don't want to actually sleep when calling this function.
2013-06-08 Christopher Faylor <me.cygwin2013@cgf.cx>
* cygwait.cc (cygwait): Remove lock around sig retrieval since this

View File

@ -236,26 +236,22 @@ check_iovec (const struct iovec *iov, int iovcnt, bool forwrite)
return (ssize_t) tot;
}
/* Try hard to schedule another thread.
Note: Don't call yield under _cygtls::lock conditions. It results in
potential starvation, especially on a single-CPU system, because
_cygtls::lock also calls yield when waiting for the lock. */
/* Try hard to schedule another thread.
Remember not to call this in a lock condition or you'll potentially
suffer starvation. */
void
yield ()
{
int prio = GetThreadPriority (GetCurrentThread ());
SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
for (int i = 0; i < 2; i++)
{
/* MSDN implies that SleepEx 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.
Note: Don't use 0 timeout. This takes a lot of CPU if something
goes wrong. */
SleepEx (1L, false);
}
/* MSDN implies that SleepEx 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.
(stackoverflow and others seem to confirm that setting this thread
to a lower priority and calling Sleep with a 0 paramenter will
have this desired effect) */
Sleep (0L);
SetThreadPriority (GetCurrentThread (), prio);
}