-#if NET_4_0 || BOOTSTRAP_NET_4_0
// AtomicBoolean.cs
//
// Copyright (c) 2008 Jérémie "Garuma" Laval
using System;
+#if INSIDE_MONO_PARALLEL
+using System.Threading;
+
+namespace Mono.Threading
+#else
namespace System.Threading
+#endif
{
- internal class AtomicBoolean
+#if INSIDE_MONO_PARALLEL
+ public
+#endif
+ struct AtomicBooleanValue
+ {
+ int flag;
+ const int UnSet = 0;
+ const int Set = 1;
+
+ public bool CompareAndExchange (bool expected, bool newVal)
+ {
+ int newTemp = newVal ? Set : UnSet;
+ int expectedTemp = expected ? Set : UnSet;
+
+ return Interlocked.CompareExchange (ref flag, newTemp, expectedTemp) == expectedTemp;
+ }
+
+ public static AtomicBooleanValue FromValue (bool value)
+ {
+ AtomicBooleanValue temp = new AtomicBooleanValue ();
+ temp.Value = value;
+
+ return temp;
+ }
+
+ public bool TrySet ()
+ {
+ return !Exchange (true);
+ }
+
+ public bool TryRelaxedSet ()
+ {
+ return flag == UnSet && !Exchange (true);
+ }
+
+ public bool Exchange (bool newVal)
+ {
+ int newTemp = newVal ? Set : UnSet;
+ return Interlocked.Exchange (ref flag, newTemp) == Set;
+ }
+
+ public bool Value {
+ get {
+ return flag == Set;
+ }
+ set {
+ Exchange (value);
+ }
+ }
+
+ public bool Equals (AtomicBooleanValue rhs)
+ {
+ return this.flag == rhs.flag;
+ }
+
+ public override bool Equals (object rhs)
+ {
+ return rhs is AtomicBooleanValue ? Equals ((AtomicBooleanValue)rhs) : false;
+ }
+
+ public override int GetHashCode ()
+ {
+ return flag.GetHashCode ();
+ }
+
+ public static explicit operator bool (AtomicBooleanValue rhs)
+ {
+ return rhs.Value;
+ }
+
+ public static implicit operator AtomicBooleanValue (bool rhs)
+ {
+ return AtomicBooleanValue.FromValue (rhs);
+ }
+ }
+
+#if INSIDE_MONO_PARALLEL
+ public
+#endif
+ class AtomicBoolean
{
int flag;
const int UnSet = 0;
const int Set = 1;
-
+
public bool CompareAndExchange (bool expected, bool newVal)
{
int newTemp = newVal ? Set : UnSet;
int expectedTemp = expected ? Set : UnSet;
-
+
return Interlocked.CompareExchange (ref flag, newTemp, expectedTemp) == expectedTemp;
}
-
+
public static AtomicBoolean FromValue (bool value)
{
AtomicBoolean temp = new AtomicBoolean ();
temp.Value = value;
-
+
return temp;
}
-
+
public bool TrySet ()
{
return !Exchange (true);
}
-
+
+ public bool TryRelaxedSet ()
+ {
+ return flag == UnSet && !Exchange (true);
+ }
+
public bool Exchange (bool newVal)
{
int newTemp = newVal ? Set : UnSet;
return Interlocked.Exchange (ref flag, newTemp) == Set;
}
-
+
public bool Value {
get {
return flag == Set;
- }
+ }
set {
Exchange (value);
}
}
-
+
public bool Equals (AtomicBoolean rhs)
{
return this.flag == rhs.flag;
}
-
+
public override bool Equals (object rhs)
{
return rhs is AtomicBoolean ? Equals ((AtomicBoolean)rhs) : false;
}
-
+
public override int GetHashCode ()
{
return flag.GetHashCode ();
}
-
+
public static explicit operator bool (AtomicBoolean rhs)
{
return rhs.Value;
}
-
+
public static implicit operator AtomicBoolean (bool rhs)
{
return AtomicBoolean.FromValue (rhs);
}
}
}
-#endif