Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / Log / System / IO / Log / LogRestartAreaEnumerator.cs / 1 / LogRestartAreaEnumerator.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IO.Log
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
// See the notes on LogLogRecordEnumerator for why this is
// thread-safe: the same arguments apply here.
//
class LogRestartAreaEnumerator : IEnumerator
{
enum State
{
BeforeFirst,
Valid,
AfterLast,
Disposed
}
LogRecordSequence recordSequence;
State state;
object syncRoot;
SafeReadContext readContext;
LogLogRecord current;
internal LogRestartAreaEnumerator(LogRecordSequence recordSequence)
{
this.recordSequence = recordSequence;
this.syncRoot = new object();
this.state = State.BeforeFirst;
}
object IEnumerator.Current
{
get
{
return this.Current;
}
}
public LogRecord Current
{
get
{
lock(this.syncRoot)
{
if (this.state == State.Disposed)
#pragma warning suppress 56503
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
// IEnumerable interface contract for "current" member can throw InvalidOperationException. Suppressing this warning.
if (this.state == State.BeforeFirst)
#pragma warning suppress 56503
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.EnumNotStarted());
if (this.state == State.AfterLast)
#pragma warning suppress 56503
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.EnumEnded());
return this.current;
}
}
}
public void Dispose()
{
lock(this.syncRoot)
{
if (this.current != null)
{
this.current.Detach();
this.current = null;
}
if ((this.readContext != null) &&
(!this.readContext.IsInvalid))
{
this.readContext.Close();
}
this.state = State.Disposed;
}
}
public bool MoveNext()
{
lock(this.syncRoot)
{
if (this.state == State.Disposed)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
if (this.state == State.AfterLast)
return false;
if (this.readContext == null)
{
return ReadRestartArea();
}
else
{
if (this.current != null)
this.current.Detach();
return ReadPreviousRestartArea();
}
}
}
bool ReadRestartArea()
{
if (!((this.readContext == null || this.readContext.IsInvalid) && (this.current == null)))
{
// An internal consistency check has failed. The indicates a bug in IO.Log's internal processing
// Rather than proceeding with non-deterministic execution and risking the loss or corruption of
// log records, we failfast the process.
DiagnosticUtility.FailFast("Should only call this for first record!");
}
unsafe
{
byte *readBuffer;
int bufferLength;
ulong lsnRecord;
if (!UnsafeNativeMethods.ReadLogRestartAreaSync(
this.recordSequence.MarshalContext,
out readBuffer,
out bufferLength,
out lsnRecord,
out this.readContext))
{
this.state = State.AfterLast;
return false;
}
this.current = new LogLogRecord(
new SequenceNumber(lsnRecord),
SequenceNumber.Invalid,
SequenceNumber.Invalid,
readBuffer,
bufferLength);
this.state = State.Valid;
return true;
}
}
bool ReadPreviousRestartArea()
{
if (this.readContext == null || this.readContext.IsInvalid)
{
// An internal consistency check has failed. The indicates a bug in IO.Log's internal processing
// Rather than proceeding with non-deterministic execution and risking the loss or corruption of
// log records, we failfast the process.
DiagnosticUtility.FailFast("Should only be called for records after the first!");
}
unsafe
{
byte *readBuffer;
int bufferLength;
ulong lsnRecord;
if (!UnsafeNativeMethods.ReadPreviousLogRestartAreaSync(
this.readContext,
out readBuffer,
out bufferLength,
out lsnRecord))
{
this.state = State.AfterLast;
return false;
}
this.current = new LogLogRecord(
new SequenceNumber(lsnRecord),
SequenceNumber.Invalid,
SequenceNumber.Invalid,
readBuffer,
bufferLength);
this.state = State.Valid;
return true;
}
}
public void Reset()
{
lock (this.syncRoot)
{
if (this.state == State.Disposed)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
if (this.current != null)
{
this.current.Detach();
this.current = null;
}
if ((this.readContext != null) &&
(!this.readContext.IsInvalid))
{
this.readContext.Close();
this.readContext = null;
}
this.state = State.BeforeFirst;
}
}
}
}
// 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
- IndexedEnumerable.cs
- BitmapEffectCollection.cs
- JpegBitmapEncoder.cs
- TogglePatternIdentifiers.cs
- OrderByBuilder.cs
- XmlDataSourceView.cs
- CombinedGeometry.cs
- RequestCachePolicy.cs
- UnicodeEncoding.cs
- EntityDataSourceView.cs
- InternalControlCollection.cs
- TextureBrush.cs
- XmlNavigatorFilter.cs
- StorageAssociationTypeMapping.cs
- DateTimeEditor.cs
- HtmlElementCollection.cs
- StrongNamePublicKeyBlob.cs
- RegexTree.cs
- DataSourceView.cs
- _TransmitFileOverlappedAsyncResult.cs
- ConnectionConsumerAttribute.cs
- CubicEase.cs
- StyleReferenceConverter.cs
- DetailsViewDesigner.cs
- RuleAction.cs
- DecoderBestFitFallback.cs
- PolyLineSegment.cs
- DataTableTypeConverter.cs
- PerfCounterSection.cs
- CommandEventArgs.cs
- Scene3D.cs
- PeerPresenceInfo.cs
- WorkflowMarkupSerializationManager.cs
- WindowsTreeView.cs
- SupportingTokenBindingElement.cs
- JoinTreeNode.cs
- LOSFormatter.cs
- HtmlTernaryTree.cs
- QueryCacheKey.cs
- ContainerVisual.cs
- DoubleAnimationUsingKeyFrames.cs
- System.Data_BID.cs
- TreeNode.cs
- SqlUDTStorage.cs
- HyperLinkField.cs
- SystemResourceKey.cs
- JsonEnumDataContract.cs
- EdmComplexTypeAttribute.cs
- CorrelationInitializer.cs
- TextRunCache.cs
- PersonalizationEntry.cs
- StandardTransformFactory.cs
- LocalBuilder.cs
- CustomErrorCollection.cs
- OleDbPropertySetGuid.cs
- ManagementDateTime.cs
- AppDomainEvidenceFactory.cs
- StringComparer.cs
- CodeGen.cs
- DefaultEventAttribute.cs
- CannotUnloadAppDomainException.cs
- AddInAdapter.cs
- RegexCode.cs
- Walker.cs
- XmlCharCheckingReader.cs
- TranslateTransform.cs
- OciHandle.cs
- SQLDoubleStorage.cs
- RadioButtonRenderer.cs
- SecureUICommand.cs
- LinkUtilities.cs
- DataAdapter.cs
- ResolveMatchesApril2005.cs
- HtmlInputControl.cs
- Tokenizer.cs
- ToolboxItemAttribute.cs
- FullTextLine.cs
- ServiceContractListItemList.cs
- SmtpNegotiateAuthenticationModule.cs
- SHA1CryptoServiceProvider.cs
- StackOverflowException.cs
- QueueTransferProtocol.cs
- TemplateXamlParser.cs
- Quad.cs
- InternalRelationshipCollection.cs
- TreeView.cs
- InfiniteTimeSpanConverter.cs
- VirtualizedCellInfoCollection.cs
- TextRangeEditTables.cs
- DataGridViewCellStyleConverter.cs
- EdmItemCollection.cs
- CompiledQueryCacheEntry.cs
- SplineKeyFrames.cs
- BitmapScalingModeValidation.cs
- TypeDelegator.cs
- RunWorkerCompletedEventArgs.cs
- SpellCheck.cs
- SystemNetworkInterface.cs
- DropShadowEffect.cs
- StoreItemCollection.cs