-#if NET_4_0 || BOOTSTRAP_NET_4_0
// SpinWait.cs
//
// Copyright (c) 2008 Jérémie "Garuma" Laval
//
//
+#if NET_4_0
using System;
namespace System.Threading
public struct SpinWait
{
// The number of step until SpinOnce yield on multicore machine
- const int step = 5;
- const int maxTime = 50;
+ const int step = 10;
+ const int maxTime = 200;
static readonly bool isSingleCpu = (Environment.ProcessorCount == 1);
int ntime;
public void SpinOnce ()
{
+ ntime += 1;
+
if (isSingleCpu) {
// On a single-CPU system, spinning does no good
Thread.Yield ();
} else {
- if ((ntime = ntime == maxTime ? maxTime : ntime + 1) % step == 0)
+ if (ntime % step == 0)
Thread.Yield ();
else
// Multi-CPU system might be hyper-threaded, let other thread run
- Thread.SpinWait (ntime << 1);
+ Thread.SpinWait (Math.Min (ntime, maxTime) << 1);
}
}
- public static void SpinUntil (Func<bool> predicate)
+ public static void SpinUntil (Func<bool> condition)
{
SpinWait sw = new SpinWait ();
- while (!predicate ())
+ while (!condition ())
sw.SpinOnce ();
}
- public static bool SpinUntil (Func<bool> predicate, TimeSpan ts)
+ public static bool SpinUntil (Func<bool> condition, TimeSpan timeout)
{
- return SpinUntil (predicate, (int)ts.TotalMilliseconds);
+ return SpinUntil (condition, (int)timeout.TotalMilliseconds);
}
- public static bool SpinUntil (Func<bool> predicate, int milliseconds)
+ public static bool SpinUntil (Func<bool> condition, int millisecondsTimeout)
{
SpinWait sw = new SpinWait ();
Watch watch = Watch.StartNew ();
- while (!predicate ()) {
- if (watch.ElapsedMilliseconds > milliseconds)
+ while (!condition ()) {
+ if (watch.ElapsedMilliseconds > millisecondsTimeout)
return false;
sw.SpinOnce ();
}