Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Channels / SynchronousChannel.cs / 1305376 / SynchronousChannel.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // SynchronousChannel.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// The simplest channel is one that has no synchronization. This is used for stop- /// and-go productions where we are guaranteed the consumer is not running /// concurrently. It just wraps a FIFO queue internally. /// /// Assumptions: /// Producers and consumers never try to enqueue/dequeue concurrently. /// ///internal sealed class SynchronousChannel { // We currently use the BCL FIFO queue internally, although any would do. private Queue m_queue; #if DEBUG // In debug builds, we keep track of when the producer is done (for asserts). private bool m_done; #endif //------------------------------------------------------------------------------------ // Instantiates a new queue. // internal SynchronousChannel() { } //----------------------------------------------------------------------------------- // Initializes the queue for this channel. // internal void Init() { m_queue = new Queue (); } //----------------------------------------------------------------------------------- // Enqueue a new item. // // Arguments: // item - the item to place into the queue // timeoutMilliseconds - synchronous channels never wait, so this is unused // // Assumptions: // The producer has not signaled that it's done yet. // // Return Value: // Synchronous channels always return true for this function. It can't timeout. // internal void Enqueue(T item) { Contract.Assert(m_queue != null); #if DEBUG Contract.Assert(!m_done, "trying to enqueue into the queue after production is done"); #endif m_queue.Enqueue(item); } //----------------------------------------------------------------------------------- // Dequeue the next item in the queue. // // Return Value: // The item removed from the queue. // // Assumptions: // The producer must be done producing. This queue is meant for synchronous // production/consumption, therefore it's unsafe for the consumer to try and // dequeue an item while a producer might be enqueueing one. // internal T Dequeue() { Contract.Assert(m_queue != null); #if DEBUG Contract.Assert(m_done, "trying to dequeue before production is done -- this is not safe"); #endif return m_queue.Dequeue(); } //------------------------------------------------------------------------------------ // Signals that a producer will no longer be enqueueing items. // internal void SetDone() { #if DEBUG // We only track this in DEBUG builds to aid in debugging. This ensures we // can assert dequeue-before-done and enqueue-after-done invariants above. m_done = true; #endif } //----------------------------------------------------------------------------------- // Copies the internal contents of this channel to an array. // internal void CopyTo(T[] array, int arrayIndex) { Contract.Assert(array != null); #if DEBUG Contract.Assert(m_done, "Can only copy from the channel after it's done being added to"); #endif m_queue.CopyTo(array, arrayIndex); } //------------------------------------------------------------------------------------ // Retrieves the current count of items in the queue. // internal int Count { get { Contract.Assert(m_queue != null); return m_queue.Count; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // SynchronousChannel.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// The simplest channel is one that has no synchronization. This is used for stop- /// and-go productions where we are guaranteed the consumer is not running /// concurrently. It just wraps a FIFO queue internally. /// /// Assumptions: /// Producers and consumers never try to enqueue/dequeue concurrently. /// ///internal sealed class SynchronousChannel { // We currently use the BCL FIFO queue internally, although any would do. private Queue m_queue; #if DEBUG // In debug builds, we keep track of when the producer is done (for asserts). private bool m_done; #endif //------------------------------------------------------------------------------------ // Instantiates a new queue. // internal SynchronousChannel() { } //----------------------------------------------------------------------------------- // Initializes the queue for this channel. // internal void Init() { m_queue = new Queue (); } //----------------------------------------------------------------------------------- // Enqueue a new item. // // Arguments: // item - the item to place into the queue // timeoutMilliseconds - synchronous channels never wait, so this is unused // // Assumptions: // The producer has not signaled that it's done yet. // // Return Value: // Synchronous channels always return true for this function. It can't timeout. // internal void Enqueue(T item) { Contract.Assert(m_queue != null); #if DEBUG Contract.Assert(!m_done, "trying to enqueue into the queue after production is done"); #endif m_queue.Enqueue(item); } //----------------------------------------------------------------------------------- // Dequeue the next item in the queue. // // Return Value: // The item removed from the queue. // // Assumptions: // The producer must be done producing. This queue is meant for synchronous // production/consumption, therefore it's unsafe for the consumer to try and // dequeue an item while a producer might be enqueueing one. // internal T Dequeue() { Contract.Assert(m_queue != null); #if DEBUG Contract.Assert(m_done, "trying to dequeue before production is done -- this is not safe"); #endif return m_queue.Dequeue(); } //------------------------------------------------------------------------------------ // Signals that a producer will no longer be enqueueing items. // internal void SetDone() { #if DEBUG // We only track this in DEBUG builds to aid in debugging. This ensures we // can assert dequeue-before-done and enqueue-after-done invariants above. m_done = true; #endif } //----------------------------------------------------------------------------------- // Copies the internal contents of this channel to an array. // internal void CopyTo(T[] array, int arrayIndex) { Contract.Assert(array != null); #if DEBUG Contract.Assert(m_done, "Can only copy from the channel after it's done being added to"); #endif m_queue.CopyTo(array, arrayIndex); } //------------------------------------------------------------------------------------ // Retrieves the current count of items in the queue. // internal int Count { get { Contract.Assert(m_queue != null); return m_queue.Count; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CreateUserErrorEventArgs.cs
- ComponentDispatcher.cs
- FormatterConverter.cs
- XmlDomTextWriter.cs
- PointLight.cs
- FunctionImportMapping.cs
- _HTTPDateParse.cs
- CodeSnippetCompileUnit.cs
- LoginName.cs
- NumberFormatter.cs
- UIElementParagraph.cs
- SqlConnection.cs
- SqlDataSource.cs
- CustomCredentialPolicy.cs
- ErrorTableItemStyle.cs
- XmlSchemaDocumentation.cs
- DrawingVisualDrawingContext.cs
- ArglessEventHandlerProxy.cs
- IBuiltInEvidence.cs
- ConfigurationLocation.cs
- EntityDataSourceContextCreatingEventArgs.cs
- QueryBranchOp.cs
- URLEditor.cs
- RegistrySecurity.cs
- KeyToListMap.cs
- ComponentCollection.cs
- MeasureItemEvent.cs
- XmlQualifiedName.cs
- FontStretchConverter.cs
- BitmapEffectGeneralTransform.cs
- HandlerBase.cs
- GeneralTransform2DTo3D.cs
- SQLBinaryStorage.cs
- DataServiceRequestOfT.cs
- ReadOnlyPropertyMetadata.cs
- CrossContextChannel.cs
- TextSpanModifier.cs
- ToolStripSplitStackLayout.cs
- ParenthesizePropertyNameAttribute.cs
- Task.cs
- TypeUnloadedException.cs
- Int32RectValueSerializer.cs
- LoadedOrUnloadedOperation.cs
- dbdatarecord.cs
- BitmapEffectDrawingContextState.cs
- BuildProviderAppliesToAttribute.cs
- SqlUserDefinedAggregateAttribute.cs
- WebPartManagerInternals.cs
- CheckBoxStandardAdapter.cs
- MethodExpr.cs
- FormViewPageEventArgs.cs
- StorageRoot.cs
- ListCardsInFileRequest.cs
- CorrelationValidator.cs
- NavigationWindowAutomationPeer.cs
- Base64Encoder.cs
- NetworkAddressChange.cs
- ServiceReference.cs
- KeyGestureConverter.cs
- InheritedPropertyDescriptor.cs
- PropertyEmitter.cs
- NameTable.cs
- CodeDomSerializer.cs
- Literal.cs
- PeerCollaboration.cs
- LinkedList.cs
- ObjectDataSourceStatusEventArgs.cs
- InplaceBitmapMetadataWriter.cs
- RelatedCurrencyManager.cs
- LifetimeServices.cs
- ConfigurationManagerInternalFactory.cs
- Invariant.cs
- InArgumentConverter.cs
- SqlWebEventProvider.cs
- SaveFileDialog.cs
- EventToken.cs
- ReachSerializationCacheItems.cs
- WpfXamlLoader.cs
- OleDbErrorCollection.cs
- Tuple.cs
- contentDescriptor.cs
- StatusBarPanel.cs
- TextDecorationCollection.cs
- MethodCallExpression.cs
- KeyFrames.cs
- QueueProcessor.cs
- Vector3DAnimation.cs
- DiagnosticTraceSource.cs
- CommandEventArgs.cs
- Fault.cs
- DateTimeValueSerializer.cs
- ProcessStartInfo.cs
- hresults.cs
- GeneralTransform3DCollection.cs
- EventLogPermission.cs
- SelectionBorderGlyph.cs
- SpecialNameAttribute.cs
- GridViewColumnCollection.cs
- ContractMapping.cs
- DBDataPermissionAttribute.cs