Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Threading / Interlocked.cs / 1 / 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);
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ButtonPopupAdapter.cs
- VersionedStreamOwner.cs
- TextRange.cs
- ServiceInstanceProvider.cs
- Selection.cs
- ReadOnlyDictionary.cs
- StringKeyFrameCollection.cs
- TextInfo.cs
- SerTrace.cs
- TextServicesDisplayAttribute.cs
- ClientFormsAuthenticationMembershipProvider.cs
- SuppressMergeCheckAttribute.cs
- ToolStripItemImageRenderEventArgs.cs
- RelationshipNavigation.cs
- MsmqNonTransactedPoisonHandler.cs
- TreeNodeCollectionEditorDialog.cs
- WeakReferenceEnumerator.cs
- ResourceReferenceExpressionConverter.cs
- BindableAttribute.cs
- PermissionAttributes.cs
- TableLayoutRowStyleCollection.cs
- Formatter.cs
- DataStreamFromComStream.cs
- ObjectItemConventionAssemblyLoader.cs
- ThousandthOfEmRealPoints.cs
- DelimitedListTraceListener.cs
- SendingRequestEventArgs.cs
- ResolveMatchesMessage11.cs
- DataGridViewComboBoxColumn.cs
- filewebresponse.cs
- OleAutBinder.cs
- ExtensionSimplifierMarkupObject.cs
- OrderedDictionary.cs
- XmlWriter.cs
- SessionStateContainer.cs
- RegisteredExpandoAttribute.cs
- HttpCookie.cs
- WebCategoryAttribute.cs
- QueueProcessor.cs
- RichTextBoxContextMenu.cs
- TypeCollectionDesigner.xaml.cs
- BlockUIContainer.cs
- DictionaryEntry.cs
- StyleCollection.cs
- LinqDataSourceHelper.cs
- DifferencingCollection.cs
- DataSourceProvider.cs
- ServiceDescriptionImporter.cs
- sqlser.cs
- DllNotFoundException.cs
- FontCacheUtil.cs
- RemoteWebConfigurationHost.cs
- ItemsPresenter.cs
- PrintDialogDesigner.cs
- Update.cs
- DelegateArgumentReference.cs
- DependencyPropertyDescriptor.cs
- VarInfo.cs
- mediaeventargs.cs
- SafeArrayTypeMismatchException.cs
- NotifyParentPropertyAttribute.cs
- AuthenticatingEventArgs.cs
- RegexCaptureCollection.cs
- CodeAttributeArgument.cs
- DataKeyCollection.cs
- ClientUtils.cs
- returneventsaver.cs
- Main.cs
- SessionStateSection.cs
- SuppressMergeCheckAttribute.cs
- ComponentEditorForm.cs
- ExtensionDataObject.cs
- ScrollViewerAutomationPeer.cs
- ToolStripPanelSelectionBehavior.cs
- SymmetricSecurityProtocol.cs
- DynamicMethod.cs
- ListItemCollection.cs
- StatusStrip.cs
- LicFileLicenseProvider.cs
- UserControlCodeDomTreeGenerator.cs
- CopyNamespacesAction.cs
- ProbeMatchesMessageCD1.cs
- ProgressBar.cs
- ProbeRequestResponseAsyncResult.cs
- ImageInfo.cs
- QilIterator.cs
- webbrowsersite.cs
- DataGridViewCheckBoxCell.cs
- Vector.cs
- SynchronizedDispatch.cs
- ListViewGroupItemCollection.cs
- UnsafeNativeMethods.cs
- Emitter.cs
- BrowserTree.cs
- ConnectionsZone.cs
- ConfigXmlWhitespace.cs
- PenThread.cs
- ProtocolsConfiguration.cs
- TypeConverterMarkupExtension.cs
- WithParamAction.cs