Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / _LocalDataStore.cs / 1 / _LocalDataStore.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================================== ** ** Class: LocalDataStore ** ** ** Purpose: Class that stores local data. This class is used in cooperation ** with the _LocalDataStoreMgr class. ** ** =============================================================================*/ namespace System { using System; using System.Threading; using System.Runtime.CompilerServices; // This class will not be marked serializable internal class LocalDataStore { /*========================================================================= ** DON'T CHANGE THESE UNLESS YOU MODIFY LocalDataStoreBaseObject in vm\object.h =========================================================================*/ private Object[] m_DataTable; private LocalDataStoreMgr m_Manager; #pragma warning disable 414 // Field is not used from managed. private int DONT_USE_InternalStore = 0; // pointer #pragma warning restore 414 /*========================================================================= ** Initialize the data store. =========================================================================*/ public LocalDataStore(LocalDataStoreMgr mgr, int InitialCapacity) { if (null == mgr) throw new ArgumentNullException("mgr"); // Store the manager of the local data store. m_Manager = mgr; // Allocate the array that will contain the data. m_DataTable = new Object[InitialCapacity]; } /*========================================================================= ** Retrieves the value from the specified slot. =========================================================================*/ public Object GetData(LocalDataStoreSlot slot) { Object o = null; // Validate the slot. m_Manager.ValidateSlot(slot); // Cache the slot index to avoid synchronization issues. int slotIdx = slot.Slot; if (slotIdx >= 0) { // Delay expansion of m_DataTable if we can if (slotIdx >= m_DataTable.Length) return null; // Retrieve the data from the given slot. o = m_DataTable[slotIdx]; } // Check if the slot has become invalid. if (!slot.IsValid()) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_SlotHasBeenFreed")); return o; } /*========================================================================== ** Sets the data in the specified slot. =========================================================================*/ public void SetData(LocalDataStoreSlot slot, Object data) { // Validate the slot. m_Manager.ValidateSlot(slot); // I can't think of a way to avoid the race described in the // LocalDataStoreSlot finalizer method without a lock. bool tookLock = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.ReliableEnter(m_Manager, ref tookLock); if (!slot.IsValid()) throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_SlotHasBeenFreed")); // Do the actual set operation. SetDataInternal(slot.Slot, data, true /*bAlloc*/ ); } finally { if (tookLock) Monitor.Exit(m_Manager); } } /*========================================================================= ** This method does the actual work of setting the data. =========================================================================*/ internal void SetDataInternal(int slot, Object data, bool bAlloc) { // We try to delay allocate the dataTable (in cases like the manager clearing a // just-freed slot in all stores if (slot >= m_DataTable.Length) { if (!bAlloc) return; SetCapacity(m_Manager.GetSlotTableLength()); } // Set the data on the given slot. m_DataTable[slot] = data; } /*========================================================================== ** Method used to set the capacity of the local data store. =========================================================================*/ private void SetCapacity(int capacity) { // Validate that the specified capacity is larger than the current one. if (capacity < m_DataTable.Length) throw new ArgumentException(Environment.GetResourceString("Argument_ALSInvalidCapacity")); // Allocate the new data table. Object[] NewDataTable = new Object[capacity]; // Copy all the objects into the new table. Array.Copy(m_DataTable, NewDataTable, m_DataTable.Length); // Save the new table. m_DataTable = NewDataTable; } } }
Link Menu
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- StronglyTypedResourceBuilder.cs
- DesignerProperties.cs
- DiscoveryClientElement.cs
- PackageProperties.cs
- ServicePointManagerElement.cs
- SyndicationItemFormatter.cs
- ModifierKeysConverter.cs
- StateItem.cs
- XmlDocumentType.cs
- OLEDB_Util.cs
- Dispatcher.cs
- PersonalizationStateInfoCollection.cs
- SID.cs
- IsolatedStorageException.cs
- PageAdapter.cs
- ListViewContainer.cs
- SqlInfoMessageEvent.cs
- TypeSystemHelpers.cs
- TextRangeBase.cs
- StorageBasedPackageProperties.cs
- JournalNavigationScope.cs
- Int64Storage.cs
- MailMessageEventArgs.cs
- DrawingImage.cs
- SurrogateSelector.cs
- DuplexChannel.cs
- ClientCultureInfo.cs
- GregorianCalendar.cs
- AnimatedTypeHelpers.cs
- NullableConverter.cs
- SourceChangedEventArgs.cs
- RadioButtonAutomationPeer.cs
- Descriptor.cs
- OperatorExpressions.cs
- ZipIOLocalFileHeader.cs
- ReadOnlyPropertyMetadata.cs
- PropertyNames.cs
- HostingEnvironmentSection.cs
- QueryPageSettingsEventArgs.cs
- ActiveDocumentEvent.cs
- Msmq4PoisonHandler.cs
- WebPartEditorOkVerb.cs
- BackgroundWorker.cs
- DataBindEngine.cs
- Clipboard.cs
- EnumType.cs
- OneToOneMappingSerializer.cs
- DatePickerAutomationPeer.cs
- TextEncodedRawTextWriter.cs
- RecordsAffectedEventArgs.cs
- DaylightTime.cs
- MimeImporter.cs
- TriggerCollection.cs
- TextEffectCollection.cs
- XmlC14NWriter.cs
- RequestQueryParser.cs
- MetadataCache.cs
- XmlResolver.cs
- SqlBulkCopy.cs
- JoinGraph.cs
- HtmlContainerControl.cs
- TemplateApplicationHelper.cs
- XamlWriter.cs
- DataGrid.cs
- UriSectionReader.cs
- EntityReference.cs
- ParameterBuilder.cs
- SocketInformation.cs
- RegexNode.cs
- PageThemeBuildProvider.cs
- NegationPusher.cs
- EntityViewGenerationAttribute.cs
- AlgoModule.cs
- CodeAccessSecurityEngine.cs
- SiteMap.cs
- WorkflowOperationFault.cs
- CardSpaceSelector.cs
- IsolationInterop.cs
- ElementNotAvailableException.cs
- ContextMarshalException.cs
- ValidationRuleCollection.cs
- MonikerUtility.cs
- SessionStateUtil.cs
- XmlRawWriter.cs
- TripleDES.cs
- ComboBoxAutomationPeer.cs
- CompareInfo.cs
- WebZone.cs
- ComplusTypeValidator.cs
- ServerValidateEventArgs.cs
- OdbcCommand.cs
- UnauthorizedAccessException.cs
- DeleteHelper.cs
- ImageListDesigner.cs
- SymbolTable.cs
- AccessDataSource.cs
- Terminate.cs
- CompensatableTransactionScopeActivity.cs
- ArraySubsetEnumerator.cs
- StringCollection.cs