Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Threading / Interlocked.cs / 2 / Interlocked.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System.Threading {
using System;
using System.Security.Permissions;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
// After much discussion, we decided the Interlocked class doesn't need
// any HPA's for synchronization or external threading. They hurt C#'s
// codegen for the yield keyword, and arguably they didn't protect much.
// Instead, they penalized people (and compilers) for writing threadsafe
// code.
public static class Interlocked
{
/******************************
* Increment
* Implemented: int
* long
*****************************/
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int Increment(ref int location);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern long Increment(ref long location);
/******************************
* Decrement
* Implemented: int
* long
*****************************/
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int Decrement(ref int location);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern long Decrement(ref long location);
/******************************
* Exchange
* Implemented: int
* long
* float
* double
* Object
* IntPtr
*****************************/
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int Exchange(ref int location1, int value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern long Exchange(ref long location1, long value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern float Exchange(ref float location1, float value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern double Exchange(ref double location1, double value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern Object Exchange(ref Object location1, Object value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern IntPtr Exchange(ref IntPtr location1, IntPtr value);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[System.Runtime.InteropServices.ComVisible(false)]
public static T Exchange(ref T location1, T value) where T : class
{
_Exchange(__makeref(location1), __makeref(value));
//Since value is a local we use trash its data on return
// The Exchange replaces the data with new data
// so after the return "value" contains the original location1
//See ExchangeGeneric for more details
return value;
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
private static extern void _Exchange(TypedReference location1, TypedReference value);
/******************************
* CompareExchange
* Implemented: int
* long
* float
* double
* Object
* IntPtr
*****************************/
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int CompareExchange(ref int location1, int value, int comparand);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern long CompareExchange(ref long location1, long value, long comparand);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern float CompareExchange(ref float location1, float value, float comparand);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern double CompareExchange(ref double location1, double value, double comparand);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern Object CompareExchange(ref Object location1, Object value, Object comparand);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern IntPtr CompareExchange(ref IntPtr location1, IntPtr value, IntPtr comparand);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[System.Runtime.InteropServices.ComVisible(false)]
public static T CompareExchange(ref T location1, T value, T comparand) where T : class
{
_CompareExchange(__makeref(location1), __makeref(value), comparand);
//Since value is a local we use trash its data on return
// The Exchange replaces the data with new data
// so after the return "value" contains the original location1
//See CompareExchangeGeneric for more details
return value;
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
private static extern void _CompareExchange(TypedReference location1, TypedReference value, Object comparand);
/******************************
* Add
* Implemented: int
* long
*****************************/
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern int ExchangeAdd(ref int location1, int value);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal static extern long ExchangeAdd(ref long location1, long value);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static int Add(ref int location1, int value)
{
return ExchangeAdd(ref location1, value) + value;
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static long Add(ref long location1, long value)
{
return ExchangeAdd(ref location1, value) + value;
}
/******************************
* Read
*****************************/
public static long Read(ref long location)
{
return Interlocked.CompareExchange(ref location,0,0);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CodeTypeConstructor.cs
- ResizingMessageFilter.cs
- Calendar.cs
- IndexOutOfRangeException.cs
- BuildProvidersCompiler.cs
- LostFocusEventManager.cs
- SetState.cs
- FontSizeConverter.cs
- PowerModeChangedEventArgs.cs
- GradientStop.cs
- Rectangle.cs
- GridViewColumnCollection.cs
- MaskedTextProvider.cs
- ToolStripHighContrastRenderer.cs
- XmlAnyElementAttributes.cs
- ControllableStoryboardAction.cs
- Interlocked.cs
- StyleHelper.cs
- OleServicesContext.cs
- webproxy.cs
- HwndTarget.cs
- x509store.cs
- WithParamAction.cs
- RemoteEndpointMessageProperty.cs
- ModelFactory.cs
- KeyValuePairs.cs
- WeakReference.cs
- DataExpression.cs
- XsdBuildProvider.cs
- TableHeaderCell.cs
- SystemBrushes.cs
- ProviderMetadata.cs
- SubstitutionList.cs
- DashStyle.cs
- RegexRunnerFactory.cs
- XmlArrayItemAttribute.cs
- Repeater.cs
- PassportIdentity.cs
- ProjectionPathBuilder.cs
- ZipIORawDataFileBlock.cs
- MenuScrollingVisibilityConverter.cs
- NodeInfo.cs
- FileRecordSequence.cs
- ExceptionRoutedEventArgs.cs
- UniqueIdentifierService.cs
- LocalServiceSecuritySettings.cs
- IntranetCredentialPolicy.cs
- BulletedList.cs
- HttpChannelListener.cs
- TransformGroup.cs
- ReversePositionQuery.cs
- _emptywebproxy.cs
- SeverityFilter.cs
- FactoryGenerator.cs
- MsmqInputSessionChannelListener.cs
- XslNumber.cs
- ListControl.cs
- SamlSubjectStatement.cs
- CommandHelpers.cs
- ToolStripContentPanelRenderEventArgs.cs
- RadioButtonPopupAdapter.cs
- BuildProvider.cs
- WebPartsPersonalization.cs
- NonDualMessageSecurityOverHttpElement.cs
- Helpers.cs
- NativeMethods.cs
- IndexerReference.cs
- DrawToolTipEventArgs.cs
- ObjectQueryExecutionPlan.cs
- Point3D.cs
- TypeToTreeConverter.cs
- DocumentViewerHelper.cs
- objectquery_tresulttype.cs
- Parameter.cs
- TimeSpanStorage.cs
- WSFederationHttpBindingElement.cs
- PrimaryKeyTypeConverter.cs
- TokenBasedSetEnumerator.cs
- CommandExpr.cs
- WebFaultException.cs
- RepeatInfo.cs
- SourceFilter.cs
- DataObjectAttribute.cs
- ControlCachePolicy.cs
- UrlMappingCollection.cs
- RuleAttributes.cs
- CloseCryptoHandleRequest.cs
- BinaryObjectInfo.cs
- PieceNameHelper.cs
- BindValidator.cs
- PermissionListSet.cs
- ValidationUtility.cs
- ModuleElement.cs
- PeekCompletedEventArgs.cs
- HostedElements.cs
- ServiceParser.cs
- ScriptControl.cs
- SqlServices.cs
- Pair.cs
- CacheEntry.cs