Code:
/ FX-1434 / FX-1434 / 1.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
- XmlTypeAttribute.cs
- DiscoveryRequestHandler.cs
- SafeFileMappingHandle.cs
- ToolStripDropDownClosingEventArgs.cs
- CompoundFileStorageReference.cs
- MailMessageEventArgs.cs
- Triangle.cs
- HostingEnvironmentException.cs
- SrgsToken.cs
- XPathBuilder.cs
- Stream.cs
- EntityWrapper.cs
- ListViewGroupConverter.cs
- WindowsFormsHostAutomationPeer.cs
- SettingsSavedEventArgs.cs
- FillBehavior.cs
- EmptyQuery.cs
- CompositeClientFormatter.cs
- SchemaType.cs
- DisplayMemberTemplateSelector.cs
- PerfCounterSection.cs
- Renderer.cs
- DeflateStream.cs
- NativeMethods.cs
- TemplatePropertyEntry.cs
- TextEditorThreadLocalStore.cs
- HyperLinkColumn.cs
- WindowsListViewSubItem.cs
- WorkflowDefinitionDispenser.cs
- RootBrowserWindow.cs
- XmlSchemaIdentityConstraint.cs
- comcontractssection.cs
- LinqDataSourceStatusEventArgs.cs
- Menu.cs
- SizeIndependentAnimationStorage.cs
- RuntimeConfig.cs
- StandardToolWindows.cs
- EntitySqlException.cs
- WebServiceData.cs
- XmlSecureResolver.cs
- InitiatorServiceModelSecurityTokenRequirement.cs
- SqlDataSourceSelectingEventArgs.cs
- _Connection.cs
- Executor.cs
- externdll.cs
- GlobalAllocSafeHandle.cs
- Emitter.cs
- Table.cs
- PageVisual.cs
- OneToOneMappingSerializer.cs
- RegexCode.cs
- DropShadowBitmapEffect.cs
- HandlerBase.cs
- CompositeCollection.cs
- ResourceDisplayNameAttribute.cs
- SQlBooleanStorage.cs
- ComplexPropertyEntry.cs
- DriveNotFoundException.cs
- ObjectParameter.cs
- KerberosSecurityTokenParameters.cs
- XmlElementCollection.cs
- TypedReference.cs
- Guid.cs
- EndEvent.cs
- NotifyInputEventArgs.cs
- UrlUtility.cs
- invalidudtexception.cs
- Transactions.cs
- RegexCapture.cs
- StringInfo.cs
- OdbcException.cs
- TextLineBreak.cs
- ResXBuildProvider.cs
- Compress.cs
- DataGridItemCollection.cs
- MenuBase.cs
- EventData.cs
- SR.cs
- PriorityBinding.cs
- PublisherMembershipCondition.cs
- TrackingRecordPreFilter.cs
- GeneralTransform3DCollection.cs
- ServiceChannel.cs
- ValueUtilsSmi.cs
- SystemIPInterfaceStatistics.cs
- ImplicitInputBrush.cs
- SamlAssertionKeyIdentifierClause.cs
- MsmqInputChannelBase.cs
- BaseTemplateBuildProvider.cs
- ReachSerializerAsync.cs
- DelegatingStream.cs
- Types.cs
- VolatileEnlistmentState.cs
- SocketException.cs
- XmlSchemaChoice.cs
- mansign.cs
- InputBindingCollection.cs
- BitmapEffectState.cs
- StylusPointDescription.cs
- WindowsFormsDesignerOptionService.cs