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
- SQLInt16.cs
- SafeCryptoKeyHandle.cs
- ThreadExceptionEvent.cs
- PassportAuthentication.cs
- QueryResultOp.cs
- ServerTooBusyException.cs
- PathFigureCollection.cs
- RuntimeArgumentHandle.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- _ChunkParse.cs
- StringFunctions.cs
- TemplateColumn.cs
- recordstatefactory.cs
- regiisutil.cs
- ActionFrame.cs
- DragDropHelper.cs
- GAC.cs
- Viewport3DVisual.cs
- XmlCountingReader.cs
- ClusterSafeNativeMethods.cs
- RectKeyFrameCollection.cs
- DesignerCatalogPartChrome.cs
- DispatcherHooks.cs
- RegularExpressionValidator.cs
- CodeDelegateCreateExpression.cs
- Constants.cs
- srgsitem.cs
- TdsParameterSetter.cs
- FlowDocumentScrollViewerAutomationPeer.cs
- SuppressIldasmAttribute.cs
- SelfIssuedAuthRSAPKCS1SignatureFormatter.cs
- ExecutionContext.cs
- GeneralTransformCollection.cs
- PropertyDescriptorCollection.cs
- MD5HashHelper.cs
- GPStream.cs
- AlternateViewCollection.cs
- DriveNotFoundException.cs
- FastPropertyAccessor.cs
- HandlerFactoryWrapper.cs
- InvalidComObjectException.cs
- IgnoreSection.cs
- MimeXmlImporter.cs
- PeerHopCountAttribute.cs
- OracleString.cs
- SrgsOneOf.cs
- FileInfo.cs
- ComPlusDiagnosticTraceRecords.cs
- Vector3DCollection.cs
- CornerRadius.cs
- SQLCharsStorage.cs
- HtmlAnchor.cs
- DelegatingConfigHost.cs
- TransactionScope.cs
- KeyManager.cs
- DecoderNLS.cs
- contentDescriptor.cs
- UnsafeNativeMethods.cs
- PlainXmlWriter.cs
- CopyCodeAction.cs
- MouseBinding.cs
- Mutex.cs
- grammarelement.cs
- NestedContainer.cs
- ColumnBinding.cs
- oledbconnectionstring.cs
- ScrollChrome.cs
- ValidatorCollection.cs
- EventBuilder.cs
- PrintController.cs
- TextServicesDisplayAttributePropertyRanges.cs
- IdentitySection.cs
- GrammarBuilderWildcard.cs
- UrlMappingCollection.cs
- CalendarDesigner.cs
- SizeConverter.cs
- ConfigXmlText.cs
- SchemaNamespaceManager.cs
- EpmContentDeSerializer.cs
- PieceDirectory.cs
- ByteAnimationBase.cs
- SubpageParagraph.cs
- SqlDataSourceQueryEditorForm.cs
- ResourceSetExpression.cs
- ElementNotAvailableException.cs
- OverflowException.cs
- HostingPreferredMapPath.cs
- RectIndependentAnimationStorage.cs
- ThicknessAnimationBase.cs
- ClientSideQueueItem.cs
- StrokeNode.cs
- InputProviderSite.cs
- RegisteredScript.cs
- MulticastIPAddressInformationCollection.cs
- ClientEventManager.cs
- RootBrowserWindowProxy.cs
- Visitor.cs
- ColumnWidthChangingEvent.cs
- BufferedGraphicsManager.cs
- UserControl.cs