Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Log / System / IO / Log / ReservationCollection.cs / 1305376 / ReservationCollection.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.IO.Log { using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Threading; public abstract class ReservationCollection : ICollection{ Dictionary reservations; List reservationKeys; int reservationCount; bool keysSorted; int version; protected ReservationCollection() { this.reservations = new Dictionary (); this.reservationKeys = new List (); this.reservationCount = 0; this.keysSorted = true; this.version = 0; } ~ReservationCollection() { Clear(); } public int Count { get { return this.reservationCount; } } public bool IsReadOnly { get { return false; } } List ReservationKeys { get { return this.reservationKeys; } } Dictionary Reservations { get { return this.reservations; } } object SyncRoot { get { return this.reservations; } } int Version { get { return this.version; } } public void Add(long size) { if (size < 0) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("size")); bool throwing = true; MakeReservation(size); try { ReservationMade(size); throwing = false; } finally { try { if (throwing) { FreeReservation(size); } } #pragma warning suppress 56500 // We will be terminating the process with any exception in this call catch (Exception e) { // The undo operation failed - IO.Log is now in an inconsistent state DiagnosticUtility.InvokeFinalHandler(e); } } } public void Clear() { Dictionary reservationsToClear; // Finalizers can run on on object even if the constructor didn't run. if(this.reservations == null || this.reservationKeys == null) { return; } lock (SyncRoot) { reservationsToClear = new Dictionary (this.reservations); this.reservations.Clear(); this.reservationKeys.Clear(); this.reservationCount = 0; this.version = 0; this.keysSorted = true; } foreach (KeyValuePair entry in reservationsToClear) { for (int i = 0; i < entry.Value; i++) { try { FreeReservation(entry.Key); } #pragma warning suppress 56500 // We will be terminating the process with any exception in this call catch (Exception e) { // We should always be able to free a reservation DiagnosticUtility.InvokeFinalHandler(e); } } } } public bool Contains(long size) { lock (SyncRoot) { return this.reservations.ContainsKey(size); } } public void CopyTo(long[] array, int arrayIndex) { lock (SyncRoot) { if (array == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("array")); } if (array.Rank != 1) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( Error.ArgumentInvalid(SR.Argument_ArrayIsMultiDimensional)); } if (arrayIndex < array.GetLowerBound(0)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("arrayIndex")); } if(array.Length == 0 && arrayIndex == 0) { return; } if ((arrayIndex >= array.Length) || (this.reservationCount > array.Length - arrayIndex)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.Argument_CopyNotEnoughSpace)); } SortReservationKeys(); foreach(long size in this.reservationKeys) { int count = this.reservations[size]; for (int i = 0; i < count; i++) { array[arrayIndex] = size; arrayIndex++; } } } } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } public IEnumerator GetEnumerator() { lock (SyncRoot) { SortReservationKeys(); return new Enumerator(this); } } public bool Remove(long item) { bool success = false; lock (SyncRoot) { if (this.reservations.ContainsKey(item)) { ReservationFreed(item); success = true; } } if (success) { bool throwing = true; try { FreeReservation(item); throwing = false; } finally { try { if (throwing) { ReservationMade(item); } } #pragma warning suppress 56500 // We will be terminating the process with any exception in this call catch(Exception e) { // The undo operation failed - IO.Log is now in an inconsistent state DiagnosticUtility.InvokeFinalHandler(e); } } } return success; } protected abstract void MakeReservation(long size); protected abstract void FreeReservation(long size); protected void ReservationMade(long size) { if (size < 0) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("size")); lock (SyncRoot) { int count; if (!this.reservations.TryGetValue(size, out count)) { this.reservationKeys.Add(size); this.keysSorted = false; count = 0; } this.reservations[size] = count + 1; this.reservationCount++; this.version++; } } protected void ReservationFreed(long size) { lock (SyncRoot) { int count; if (!this.reservations.TryGetValue(size, out count)) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.Argument_ReservationNotFound)); count--; if (count == 0) { int index; if (this.keysSorted) index = this.reservationKeys.BinarySearch(size); else index = this.reservationKeys.IndexOf(size); this.reservationKeys.RemoveAt(index); this.reservations.Remove(size); } else { this.reservations[size] = count; } this.reservationCount--; this.version++; } } protected long GetBestMatchingReservation(long size) { lock (SyncRoot) { SortReservationKeys(); int index = this.reservationKeys.BinarySearch(size); if (index < 0) { index = ~index; if (index == this.reservationKeys.Count) return -1; } long reservation = this.reservationKeys[index]; ReservationFreed(reservation); if (reservation < size) { // 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("Binary search returned an inappropriate reservation"); } return reservation; } } void SortReservationKeys() { if (!this.keysSorted) { this.reservationKeys.Sort(); this.keysSorted = true; } } class Enumerator : IEnumerator { const long NOT_STARTED = -1; const long FINISHED = -2; ReservationCollection parent; long current; int keyIndex; int numberRemaining; int version; bool disposed; public Enumerator(ReservationCollection parent) { this.parent = parent; this.version = parent.Version; this.current = NOT_STARTED; this.keyIndex = 0; this.numberRemaining = 0; this.disposed = false; } object IEnumerator.Current { get { return this.Current; } } public long Current { get { if (this.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.current == NOT_STARTED) { #pragma warning suppress 56503 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( Error.InvalidOperation(SR.InvalidOperation_EnumNotStarted)); } if (this.current == FINISHED) { #pragma warning suppress 56503 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( Error.InvalidOperation(SR.InvalidOperation_EnumEnded)); } return this.current; } } public bool MoveNext() { if (this.disposed) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed()); } lock (this.parent.SyncRoot) { if (this.parent.Version != this.version) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( Error.InvalidOperation(SR.InvalidOperation_EnumFailedVersion)); } if (this.numberRemaining == 0) { if (this.keyIndex == this.parent.ReservationKeys.Count) { this.current = FINISHED; return false; } this.current = this.parent.ReservationKeys[this.keyIndex]; this.keyIndex++; this.numberRemaining = this.parent.Reservations[this.current]; } this.numberRemaining--; return true; } } public void Reset() { if (this.disposed) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed()); } lock (this.parent.SyncRoot) { if (this.parent.Version != this.version) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( Error.InvalidOperation(SR.InvalidOperation_EnumFailedVersion)); } this.version = this.parent.Version; this.current = NOT_STARTED; this.keyIndex = 0; this.numberRemaining = 0; } } public void Dispose() { this.disposed = true; } } } } // 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
- AspCompat.cs
- ColumnBinding.cs
- CodeIdentifier.cs
- RelationshipNavigation.cs
- ResponseBodyWriter.cs
- DiagnosticStrings.cs
- WebControlParameterProxy.cs
- XPathNode.cs
- CollectionViewGroupRoot.cs
- XmlTextWriter.cs
- EnvironmentPermission.cs
- FixedNode.cs
- PeerApplication.cs
- GeneralTransform.cs
- FixedFindEngine.cs
- DiscoveryMessageSequence11.cs
- MissingMethodException.cs
- ChannelParameterCollection.cs
- WriteableBitmap.cs
- NameValueConfigurationCollection.cs
- OdbcCommandBuilder.cs
- InstanceDataCollectionCollection.cs
- CodeNamespaceImportCollection.cs
- CurrentTimeZone.cs
- Camera.cs
- DBParameter.cs
- CellParagraph.cs
- ByteStack.cs
- ScriptReferenceBase.cs
- PreloadedPackages.cs
- XmlSchemaIdentityConstraint.cs
- ResourceProviderFactory.cs
- Column.cs
- CDSsyncETWBCLProvider.cs
- Converter.cs
- FixedSOMTextRun.cs
- ComPlusThreadInitializer.cs
- _ScatterGatherBuffers.cs
- PropertyKey.cs
- ArgumentValidation.cs
- BeginEvent.cs
- ChannelSinkStacks.cs
- FolderNameEditor.cs
- FtpRequestCacheValidator.cs
- SQLDoubleStorage.cs
- RectAnimationBase.cs
- ActivityIdHeader.cs
- PictureBox.cs
- FunctionImportMapping.cs
- TileModeValidation.cs
- XmlTextEncoder.cs
- TextChangedEventArgs.cs
- XamlReaderHelper.cs
- PiiTraceSource.cs
- COM2EnumConverter.cs
- TextContainerChangedEventArgs.cs
- NativeMethods.cs
- LambdaCompiler.Logical.cs
- GroupBox.cs
- Table.cs
- InfoCardRSAPKCS1SignatureDeformatter.cs
- BoundField.cs
- StickyNoteContentControl.cs
- EntityDataSourceSelectedEventArgs.cs
- StorageEntityContainerMapping.cs
- SiteMapDesignerDataSourceView.cs
- ListBase.cs
- DaylightTime.cs
- SizeF.cs
- SharedPerformanceCounter.cs
- SetterBase.cs
- PersonalizationEntry.cs
- StrongNameMembershipCondition.cs
- IisTraceWebEventProvider.cs
- DataGridViewRowPostPaintEventArgs.cs
- Scripts.cs
- TextEffect.cs
- TreeNodeEventArgs.cs
- MetadataUtil.cs
- EdmSchemaAttribute.cs
- ICspAsymmetricAlgorithm.cs
- SqlEnums.cs
- HwndSourceParameters.cs
- X509Certificate.cs
- TdsParserHelperClasses.cs
- BindUriHelper.cs
- XhtmlConformanceSection.cs
- ShortcutKeysEditor.cs
- StaticFileHandler.cs
- XmlSchemaSimpleType.cs
- XmlEnumAttribute.cs
- TypeForwardedToAttribute.cs
- DataControlLinkButton.cs
- XmlDocumentSchema.cs
- RuleEngine.cs
- IISUnsafeMethods.cs
- FigureParaClient.cs
- DotExpr.cs
- ChangeConflicts.cs
- BitmapMetadata.cs