Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Shared / MS / Internal / IO / SynchronizingStream.cs / 1 / SynchronizingStream.cs
//------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, 2001 // // File: SynchronizingStream.cs // // Description: Stream that locks on given syncRoot before entering any public API's. // // History: 01/20/06 - brucemac - created //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.IO; using System.Windows; namespace MS.Internal.IO.Packaging { ////// Wrap returned stream to protect non-thread-safe API's from race conditions /// internal class SynchronizingStream : Stream { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- ////// Serializes access by locking on the given object /// /// stream to read from (baseStream) /// object to lock on internal SynchronizingStream(Stream stream, Object syncRoot) { if (stream == null) throw new ArgumentNullException("stream"); if (syncRoot == null) throw new ArgumentNullException("syncRoot"); _baseStream = stream; _syncRoot = syncRoot; } //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- ////// Return the bytes requested /// /// destination buffer /// offset to write into that buffer /// how many bytes requested ///how many bytes were written into buffer public override int Read(byte[] buffer, int offset, int count) { lock (_syncRoot) { CheckDisposed(); return (_baseStream.Read(buffer, offset, count)); } } ////// Read a single byte /// ///The unsigned byte cast to an Int32, or -1 if at the end of the stream. public override int ReadByte() { lock (_syncRoot) { CheckDisposed(); return (_baseStream.ReadByte()); } } ////// Write a single byte /// /// byte to write public override void WriteByte(byte b) { lock (_syncRoot) { CheckDisposed(); _baseStream.WriteByte(b); } } ////// Seek /// /// only zero is supported /// only SeekOrigin.Begin is supported ///zero public override long Seek(long offset, SeekOrigin origin) { lock (_syncRoot) { CheckDisposed(); return _baseStream.Seek(offset, origin); } } ////// SetLength /// ///not supported public override void SetLength(long newLength) { lock (_syncRoot) { CheckDisposed(); _baseStream.SetLength(newLength); } } ////// Write /// ///not supported public override void Write(byte[] buf, int offset, int count) { lock (_syncRoot) { CheckDisposed(); _baseStream.Write(buf, offset, count); } } ////// Flush /// ///not supported public override void Flush() { lock (_syncRoot) { CheckDisposed(); _baseStream.Flush(); } } //------------------------------------------------------ // // Public Properties // //------------------------------------------------------ ////// Is stream readable? /// public override bool CanRead { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanRead); } } } ////// Is stream seekable? /// ///We MUST support seek as this is used to implement ILockBytes.ReadAt() public override bool CanSeek { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanSeek); } } } ////// Is stream writeable? /// public override bool CanWrite { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanWrite); } } } ////// Logical byte position in this stream /// public override long Position { get { lock (_syncRoot) { CheckDisposed(); return _baseStream.Position; } } set { lock (_syncRoot) { CheckDisposed(); _baseStream.Position = value; } } } ////// Length /// public override long Length { get { lock (_syncRoot) { CheckDisposed(); return _baseStream.Length; } } } //----------------------------------------------------- // // Protected Methods // //------------------------------------------------------ protected override void Dispose(bool disposing) { lock (_syncRoot) { try { if (disposing && (_baseStream != null)) { // close the underlying Stream _baseStream.Close(); // NOTE: We cannot set _syncRoot to null because it is used // on entry to every public method and property. } } finally { base.Dispose(disposing); _baseStream = null; } } } //----------------------------------------------------- // // Private Methods // //----------------------------------------------------- ////// CheckDisposed /// ///Pre-condition that lock has been acquired. private void CheckDisposed() { if (_baseStream == null) throw new ObjectDisposedException("Stream"); } //----------------------------------------------------- // // Private Fields // //------------------------------------------------------ private Stream _baseStream; // stream we are wrapping private Object _syncRoot; // object to lock on } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, 2001 // // File: SynchronizingStream.cs // // Description: Stream that locks on given syncRoot before entering any public API's. // // History: 01/20/06 - brucemac - created //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.IO; using System.Windows; namespace MS.Internal.IO.Packaging { ////// Wrap returned stream to protect non-thread-safe API's from race conditions /// internal class SynchronizingStream : Stream { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- ////// Serializes access by locking on the given object /// /// stream to read from (baseStream) /// object to lock on internal SynchronizingStream(Stream stream, Object syncRoot) { if (stream == null) throw new ArgumentNullException("stream"); if (syncRoot == null) throw new ArgumentNullException("syncRoot"); _baseStream = stream; _syncRoot = syncRoot; } //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- ////// Return the bytes requested /// /// destination buffer /// offset to write into that buffer /// how many bytes requested ///how many bytes were written into buffer public override int Read(byte[] buffer, int offset, int count) { lock (_syncRoot) { CheckDisposed(); return (_baseStream.Read(buffer, offset, count)); } } ////// Read a single byte /// ///The unsigned byte cast to an Int32, or -1 if at the end of the stream. public override int ReadByte() { lock (_syncRoot) { CheckDisposed(); return (_baseStream.ReadByte()); } } ////// Write a single byte /// /// byte to write public override void WriteByte(byte b) { lock (_syncRoot) { CheckDisposed(); _baseStream.WriteByte(b); } } ////// Seek /// /// only zero is supported /// only SeekOrigin.Begin is supported ///zero public override long Seek(long offset, SeekOrigin origin) { lock (_syncRoot) { CheckDisposed(); return _baseStream.Seek(offset, origin); } } ////// SetLength /// ///not supported public override void SetLength(long newLength) { lock (_syncRoot) { CheckDisposed(); _baseStream.SetLength(newLength); } } ////// Write /// ///not supported public override void Write(byte[] buf, int offset, int count) { lock (_syncRoot) { CheckDisposed(); _baseStream.Write(buf, offset, count); } } ////// Flush /// ///not supported public override void Flush() { lock (_syncRoot) { CheckDisposed(); _baseStream.Flush(); } } //------------------------------------------------------ // // Public Properties // //------------------------------------------------------ ////// Is stream readable? /// public override bool CanRead { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanRead); } } } ////// Is stream seekable? /// ///We MUST support seek as this is used to implement ILockBytes.ReadAt() public override bool CanSeek { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanSeek); } } } ////// Is stream writeable? /// public override bool CanWrite { get { lock (_syncRoot) { return ((_baseStream != null) && _baseStream.CanWrite); } } } ////// Logical byte position in this stream /// public override long Position { get { lock (_syncRoot) { CheckDisposed(); return _baseStream.Position; } } set { lock (_syncRoot) { CheckDisposed(); _baseStream.Position = value; } } } ////// Length /// public override long Length { get { lock (_syncRoot) { CheckDisposed(); return _baseStream.Length; } } } //----------------------------------------------------- // // Protected Methods // //------------------------------------------------------ protected override void Dispose(bool disposing) { lock (_syncRoot) { try { if (disposing && (_baseStream != null)) { // close the underlying Stream _baseStream.Close(); // NOTE: We cannot set _syncRoot to null because it is used // on entry to every public method and property. } } finally { base.Dispose(disposing); _baseStream = null; } } } //----------------------------------------------------- // // Private Methods // //----------------------------------------------------- ////// CheckDisposed /// ///Pre-condition that lock has been acquired. private void CheckDisposed() { if (_baseStream == null) throw new ObjectDisposedException("Stream"); } //----------------------------------------------------- // // Private Fields // //------------------------------------------------------ private Stream _baseStream; // stream we are wrapping private Object _syncRoot; // object to lock on } } // 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
- ConsoleCancelEventArgs.cs
- XmlTextReaderImpl.cs
- CanExecuteRoutedEventArgs.cs
- CheckoutException.cs
- DataSourceControlBuilder.cs
- DataGridAddNewRow.cs
- FilteredDataSetHelper.cs
- XamlRtfConverter.cs
- SqlError.cs
- EntityCodeGenerator.cs
- ClassDataContract.cs
- RIPEMD160.cs
- HuffModule.cs
- ReadOnlyCollection.cs
- SequenceDesigner.xaml.cs
- ServiceModelEnumValidator.cs
- BamlReader.cs
- ObjectListShowCommandsEventArgs.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- EmbeddedObject.cs
- PropertyPath.cs
- UnmanagedMemoryStreamWrapper.cs
- AuthenticationManager.cs
- AddInController.cs
- MexBindingBindingCollectionElement.cs
- WebPartConnectionsConnectVerb.cs
- DrawingGroupDrawingContext.cs
- ManifestSignatureInformation.cs
- DataGridClipboardCellContent.cs
- GridViewUpdateEventArgs.cs
- EncoderExceptionFallback.cs
- SafeCryptoKeyHandle.cs
- ColumnResizeAdorner.cs
- TTSVoice.cs
- FilteredAttributeCollection.cs
- PreviewKeyDownEventArgs.cs
- ServiceDescriptionSerializer.cs
- AudioException.cs
- GlobalProxySelection.cs
- WsiProfilesElement.cs
- PageContentAsyncResult.cs
- FlowNode.cs
- DispatcherTimer.cs
- WSSecurityPolicy11.cs
- DataServiceRequestArgs.cs
- InputScope.cs
- DecimalAverageAggregationOperator.cs
- BoundField.cs
- SspiNegotiationTokenProvider.cs
- CodeCatchClause.cs
- EdgeModeValidation.cs
- MediaEntryAttribute.cs
- SiteMap.cs
- XmlSchemaObjectCollection.cs
- InstalledVoice.cs
- SignatureHelper.cs
- PeerPresenceInfo.cs
- MetadataItemEmitter.cs
- XmlSiteMapProvider.cs
- CodeGotoStatement.cs
- PrinterResolution.cs
- UITypeEditor.cs
- StickyNoteHelper.cs
- TableStyle.cs
- PageParserFilter.cs
- DropAnimation.xaml.cs
- UserValidatedEventArgs.cs
- CompositeFontInfo.cs
- EncodingFallbackAwareXmlTextWriter.cs
- VSDExceptions.cs
- CheckBox.cs
- Int16AnimationBase.cs
- XmlNavigatorStack.cs
- XmlNodeChangedEventArgs.cs
- InputReportEventArgs.cs
- ResXDataNode.cs
- BamlWriter.cs
- WindowsListViewItem.cs
- TypeDescriptorContext.cs
- DisplayMemberTemplateSelector.cs
- SponsorHelper.cs
- StringAnimationBase.cs
- ConsoleCancelEventArgs.cs
- DiscoveryReferences.cs
- OdbcPermission.cs
- EdmProviderManifest.cs
- BooleanStorage.cs
- QilFunction.cs
- Debug.cs
- WorkflowServiceHostFactory.cs
- HyperlinkAutomationPeer.cs
- Rectangle.cs
- WebScriptMetadataInstanceContextProvider.cs
- ModuleBuilderData.cs
- ByteKeyFrameCollection.cs
- EditCommandColumn.cs
- DependencyPropertyHelper.cs
- InitiatorSessionSymmetricMessageSecurityProtocol.cs
- DecoderBestFitFallback.cs
- TaskCanceledException.cs