78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
| 
								 | 
							
								using System.Threading;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace dotNetty_kcp.thread
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class AtomicBoolean
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private int _value;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        public AtomicBoolean()
							 | 
						||
| 
								 | 
							
								            : this(false) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        /// Creates a new <c>AtomicBoolean</c> instance with the initial value provided.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public AtomicBoolean(bool value) {
							 | 
						||
| 
								 | 
							
								            _value = value ? 1 : 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// This method returns the current value.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <returns>
							 | 
						||
| 
								 | 
							
								        /// The <c>bool</c> value to be accessed atomically.
							 | 
						||
| 
								 | 
							
								        /// </returns>
							 | 
						||
| 
								 | 
							
								        public bool Get() {
							 | 
						||
| 
								 | 
							
								            return _value != 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// This method sets the current value atomically.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="value">
							 | 
						||
| 
								 | 
							
								        /// The new value to set.
							 | 
						||
| 
								 | 
							
								        /// </param>
							 | 
						||
| 
								 | 
							
								        public void Set(bool value) {
							 | 
						||
| 
								 | 
							
								            Interlocked.Exchange(ref _value, value ? 1 : 0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// This method atomically sets the value and returns the original value.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="value">
							 | 
						||
| 
								 | 
							
								        /// The new value.
							 | 
						||
| 
								 | 
							
								        /// </param>
							 | 
						||
| 
								 | 
							
								        /// <returns>
							 | 
						||
| 
								 | 
							
								        /// The value before setting to the new value.
							 | 
						||
| 
								 | 
							
								        /// </returns>
							 | 
						||
| 
								 | 
							
								        public bool GetAndSet(bool value) {
							 | 
						||
| 
								 | 
							
								            return Interlocked.Exchange(ref _value, value ? 1 : 0) != 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Atomically sets the value to the given updated value if the current value <c>==</c> the expected value.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        /// <param name="expected">
							 | 
						||
| 
								 | 
							
								        /// The value to compare against.
							 | 
						||
| 
								 | 
							
								        /// </param>
							 | 
						||
| 
								 | 
							
								        /// <param name="result">
							 | 
						||
| 
								 | 
							
								        /// The value to set if the value is equal to the <c>expected</c> value.
							 | 
						||
| 
								 | 
							
								        /// </param>
							 | 
						||
| 
								 | 
							
								        /// <returns>
							 | 
						||
| 
								 | 
							
								        /// <c>true</c> if the comparison and set was successful. A <c>false</c> indicates the comparison failed.
							 | 
						||
| 
								 | 
							
								        /// </returns>
							 | 
						||
| 
								 | 
							
								        public bool CompareAndSet(bool expected, bool result) {
							 | 
						||
| 
								 | 
							
								            int e = expected ? 1 : 0;
							 | 
						||
| 
								 | 
							
								            int r = result ? 1 : 0;
							 | 
						||
| 
								 | 
							
								            return Interlocked.CompareExchange(ref _value, r, e) == e;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// This operator allows an implicit cast from <c>AtomicBoolean</c> to <c>int</c>.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public static implicit operator bool(AtomicBoolean value) {
							 | 
						||
| 
								 | 
							
								            return value.Get();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |