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
- DependentList.cs
- ScrollChrome.cs
- InputLangChangeEvent.cs
- DrawingAttributeSerializer.cs
- ToolboxItemCollection.cs
- List.cs
- MetadataCollection.cs
- MaterialCollection.cs
- Barrier.cs
- IndentedWriter.cs
- ShaderEffect.cs
- Int16AnimationBase.cs
- MasterPage.cs
- FieldNameLookup.cs
- SchemeSettingElement.cs
- base64Transforms.cs
- CookielessData.cs
- NativeMethods.cs
- FtpRequestCacheValidator.cs
- CheckBoxList.cs
- InternalRelationshipCollection.cs
- COM2EnumConverter.cs
- CodeExpressionCollection.cs
- TextTreePropertyUndoUnit.cs
- TrustLevel.cs
- HttpContext.cs
- OracleDataReader.cs
- BindValidator.cs
- TimelineGroup.cs
- ReferentialConstraint.cs
- SamlAudienceRestrictionCondition.cs
- XsltConvert.cs
- Inflater.cs
- CodeMemberMethod.cs
- EnvelopedPkcs7.cs
- CroppedBitmap.cs
- KnownBoxes.cs
- NameValueSectionHandler.cs
- Control.cs
- PocoPropertyAccessorStrategy.cs
- TransformerConfigurationWizardBase.cs
- ComponentCollection.cs
- LineProperties.cs
- InfoCardMetadataExchangeClient.cs
- MouseGestureConverter.cs
- DataViewSettingCollection.cs
- FrameworkElementFactoryMarkupObject.cs
- OrCondition.cs
- GreenMethods.cs
- WebBrowserDesigner.cs
- Freezable.cs
- SoapReflectionImporter.cs
- ItemsPresenter.cs
- DetailsViewInsertedEventArgs.cs
- HttpModulesSection.cs
- SoapException.cs
- KeyEventArgs.cs
- ByteFacetDescriptionElement.cs
- URL.cs
- Column.cs
- RoutedCommand.cs
- RoleManagerModule.cs
- DataGridCell.cs
- DocumentViewerAutomationPeer.cs
- TypeBrowser.xaml.cs
- StringExpressionSet.cs
- FrameworkContentElement.cs
- MemberBinding.cs
- SelectingProviderEventArgs.cs
- WindowsStatusBar.cs
- IERequestCache.cs
- DataControlReference.cs
- MailSettingsSection.cs
- CacheMemory.cs
- ResourceKey.cs
- OdbcConnectionHandle.cs
- BamlCollectionHolder.cs
- PasswordDeriveBytes.cs
- ArraySortHelper.cs
- DataGridSortCommandEventArgs.cs
- IDispatchConstantAttribute.cs
- QuaternionAnimation.cs
- WebPartCatalogCloseVerb.cs
- WebPartUtil.cs
- FormattedTextSymbols.cs
- TableMethodGenerator.cs
- UndoEngine.cs
- DocComment.cs
- ThreadPool.cs
- RegisteredHiddenField.cs
- VisualStateGroup.cs
- ClockController.cs
- EncoderParameters.cs
- DoubleCollectionConverter.cs
- ColorInterpolationModeValidation.cs
- TrustManagerPromptUI.cs
- UIntPtr.cs
- SemaphoreSlim.cs
- FolderBrowserDialogDesigner.cs
- TypeDescriptor.cs