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
- DesignTableCollection.cs
- GeometryDrawing.cs
- ThicknessKeyFrameCollection.cs
- XmlEventCache.cs
- XPathQueryGenerator.cs
- WebBrowser.cs
- ObjectHandle.cs
- LinkedResource.cs
- TypeListConverter.cs
- WeakReference.cs
- HttpHandlersSection.cs
- DocumentCollection.cs
- InkCanvasSelectionAdorner.cs
- SimpleBitVector32.cs
- MetadataSource.cs
- MiniConstructorInfo.cs
- SecurityHeaderLayout.cs
- XmlSchemaAnnotated.cs
- RegisteredScript.cs
- Version.cs
- TriggerActionCollection.cs
- SQLBoolean.cs
- Panel.cs
- ToolboxBitmapAttribute.cs
- TransformerInfo.cs
- TemplateManager.cs
- DeclarativeConditionsCollection.cs
- SiteOfOriginPart.cs
- TreeViewItem.cs
- PeerUnsafeNativeCryptMethods.cs
- ColumnResizeUndoUnit.cs
- Int32Rect.cs
- EndpointIdentity.cs
- DataGridAutoFormatDialog.cs
- SslStream.cs
- CompilerCollection.cs
- LayoutEditorPart.cs
- SchemaNamespaceManager.cs
- XmlIgnoreAttribute.cs
- BufferedGraphicsManager.cs
- ComponentDispatcher.cs
- CodeIndexerExpression.cs
- RuleEngine.cs
- RelatedPropertyManager.cs
- FixedSOMTextRun.cs
- UpDownBase.cs
- ResourceKey.cs
- SqlServer2KCompatibilityAnnotation.cs
- MultilineStringConverter.cs
- StaticFileHandler.cs
- TypePropertyEditor.cs
- DeadCharTextComposition.cs
- CodeSnippetTypeMember.cs
- HttpCachePolicyElement.cs
- SmtpNtlmAuthenticationModule.cs
- HttpPostedFileWrapper.cs
- TraceRecord.cs
- DataChangedEventManager.cs
- XPathNodeIterator.cs
- ListItemConverter.cs
- CursorConverter.cs
- ContentOperations.cs
- PropertyAccessVisitor.cs
- LeaseManager.cs
- MinMaxParagraphWidth.cs
- ArraySortHelper.cs
- ActivityInterfaces.cs
- AllMembershipCondition.cs
- ProfileManager.cs
- Nullable.cs
- SystemEvents.cs
- MappableObjectManager.cs
- Parameter.cs
- DesigntimeLicenseContext.cs
- IsolatedStorageFileStream.cs
- NodeFunctions.cs
- SamlAssertionKeyIdentifierClause.cs
- MessageLogTraceRecord.cs
- AlgoModule.cs
- XAMLParseException.cs
- Quaternion.cs
- HostExecutionContextManager.cs
- SystemNetHelpers.cs
- PropVariant.cs
- FacetChecker.cs
- HttpFileCollectionBase.cs
- FrameworkContextData.cs
- XmlDataCollection.cs
- AudioDeviceOut.cs
- CompilerGlobalScopeAttribute.cs
- DataFieldConverter.cs
- FileVersion.cs
- ChangeBlockUndoRecord.cs
- SrgsToken.cs
- ContentElement.cs
- X500Name.cs
- PropertyNames.cs
- autovalidator.cs
- UserControlDocumentDesigner.cs
- TemplatedMailWebEventProvider.cs