Code:
/ DotNET / DotNET / 8.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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FontCacheLogic.cs
- XmlSchemaFacet.cs
- Int16Storage.cs
- DefaultCommandConverter.cs
- TcpTransportManager.cs
- ModuleBuilderData.cs
- _ListenerRequestStream.cs
- UrlAuthFailureHandler.cs
- _NativeSSPI.cs
- BmpBitmapDecoder.cs
- StateWorkerRequest.cs
- StrokeRenderer.cs
- XslVisitor.cs
- TextPointer.cs
- XPathBinder.cs
- FillBehavior.cs
- ConsoleTraceListener.cs
- MatrixCamera.cs
- RoleGroupCollection.cs
- UnsafeNativeMethods.cs
- PhysicalOps.cs
- Emitter.cs
- _DigestClient.cs
- BreakRecordTable.cs
- DataBinding.cs
- SafeRightsManagementQueryHandle.cs
- WaitForChangedResult.cs
- DesignTimeTemplateParser.cs
- ShapingWorkspace.cs
- BaseContextMenu.cs
- ContentDisposition.cs
- PhysicalAddress.cs
- ItemDragEvent.cs
- TextRunProperties.cs
- RequestQueue.cs
- MetadataArtifactLoaderFile.cs
- ObjectIDGenerator.cs
- TransformerTypeCollection.cs
- CodeMethodReturnStatement.cs
- VirtualizingStackPanel.cs
- WsdlBuildProvider.cs
- AmbiguousMatchException.cs
- formatter.cs
- DataReceivedEventArgs.cs
- RawAppCommandInputReport.cs
- KeyValueConfigurationElement.cs
- SqlRemoveConstantOrderBy.cs
- DataGridViewCell.cs
- StringValueSerializer.cs
- StringStorage.cs
- PageStatePersister.cs
- ThreadStateException.cs
- SoapAttributes.cs
- SqlDependency.cs
- ActivationArguments.cs
- MessageEncodingBindingElementImporter.cs
- StringOutput.cs
- UIElement3D.cs
- OdbcConnectionFactory.cs
- XamlSerializer.cs
- OdbcUtils.cs
- DeviceContexts.cs
- ProfileProvider.cs
- DataServiceConfiguration.cs
- Section.cs
- HtmlUtf8RawTextWriter.cs
- TextViewBase.cs
- SqlCharStream.cs
- SqlBuilder.cs
- String.cs
- VectorAnimationUsingKeyFrames.cs
- DrawListViewSubItemEventArgs.cs
- WeakHashtable.cs
- IndentTextWriter.cs
- DataGridViewRowCollection.cs
- DesignerOptionService.cs
- HyperLinkField.cs
- MobileCategoryAttribute.cs
- DataControlImageButton.cs
- DelimitedListTraceListener.cs
- OrderablePartitioner.cs
- CodeNamespaceImportCollection.cs
- HtmlTernaryTree.cs
- WindowsComboBox.cs
- StrokeCollectionConverter.cs
- QilValidationVisitor.cs
- RootNamespaceAttribute.cs
- BaseCAMarshaler.cs
- CollectionViewGroup.cs
- FileCodeGroup.cs
- OleDbCommand.cs
- SystemIcmpV6Statistics.cs
- GrammarBuilderPhrase.cs
- __ConsoleStream.cs
- DataTable.cs
- FontDriver.cs
- SystemBrushes.cs
- InternalRelationshipCollection.cs
- ProfileEventArgs.cs
- DescendantOverDescendantQuery.cs