summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/miscfuncs.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/miscfuncs.cc')
-rw-r--r--winsup/cygwin/miscfuncs.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index 0ac25f4c3..d293edea9 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -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,