Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Input / Stylus / PenThreadPool.cs / 1305600 / PenThreadPool.cs
using System; using System.Collections.Generic; using System.Threading; using System.Windows.Threading; using System.Security; using System.Security.Permissions; using MS.Win32.Penimc; namespace System.Windows.Input { ///////////////////////////////////////////////////////////////////////// ////// /// internal class PenThreadPool { ////// Critical - Constructor for singleton of our PenThreadPool. /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// Instance (above) /// /// [SecurityCritical] static PenThreadPool() { } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] [ThreadStatic] private static PenThreadPool _penThreadPool; ///////////////////////////////////////////////////////////////////// ////// ////// Critical - Returns a PenThread (creates as needed). /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// PenContext.Dispose /// PenContext.Enable /// PenContext.Disable /// /// [SecurityCritical] internal static PenThread GetPenThreadForPenContext(PenContext penContext) { // Create the threadstatic DynamicRendererThreadManager as needed for calling thread. // It only creates one if (_penThreadPool == null) { _penThreadPool = new PenThreadPool(); } return _penThreadPool.GetPenThreadForPenContextHelper(penContext); // Adds to weak ref list if creating new one. } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] private List_penThreadWeakRefList; ///////////////////////////////////////////////////////////////////// /// /// /// ////// Critical - Initializes critical data: m_PenThreads /// /// [SecurityCritical] internal PenThreadPool() { _penThreadWeakRefList = new List(); } /// /// Critical - Calls SecurityCritical code (PenThread constructor). /// Called by BeginService. /// TreatAsSafe boundry is Stylus.EnableCore, Stylus.RegisterHwndForInput /// and HwndWrapperHook class (via HwndSource.InputFilterMessage). /// [SecurityCritical] private PenThread GetPenThreadForPenContextHelper(PenContext penContext) { bool needCleanup = false; PenThread penThread = null; int i; // Scan existing penthreads to see if we have an available slot for context. for (i=0; i < _penThreadWeakRefList.Count; i++) { PenThread penThreadFound = _penThreadWeakRefList[i].Target as PenThread; if (penThreadFound == null) { needCleanup = true; } else { // See if we can use this one if (penContext == null || penThreadFound.AddPenContext(penContext)) { // We can use this one. penThread = penThreadFound; break; } } } if (needCleanup) { // prune invalid refs for (i=_penThreadWeakRefList.Count - 1; i >= 0; i--) { if (_penThreadWeakRefList[i].Target == null) { _penThreadWeakRefList.RemoveAt(i); } } } if (penThread == null) { penThread = new PenThread(); // Make sure we add this context to the penthread if (penContext != null) { penThread.AddPenContext(penContext); } _penThreadWeakRefList.Add(new WeakReference(penThread)); } return penThread; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Threading; using System.Windows.Threading; using System.Security; using System.Security.Permissions; using MS.Win32.Penimc; namespace System.Windows.Input { ///////////////////////////////////////////////////////////////////////// ////// /// internal class PenThreadPool { ////// Critical - Constructor for singleton of our PenThreadPool. /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// Instance (above) /// /// [SecurityCritical] static PenThreadPool() { } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] [ThreadStatic] private static PenThreadPool _penThreadPool; ///////////////////////////////////////////////////////////////////// ////// ////// Critical - Returns a PenThread (creates as needed). /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// PenContext.Dispose /// PenContext.Enable /// PenContext.Disable /// /// [SecurityCritical] internal static PenThread GetPenThreadForPenContext(PenContext penContext) { // Create the threadstatic DynamicRendererThreadManager as needed for calling thread. // It only creates one if (_penThreadPool == null) { _penThreadPool = new PenThreadPool(); } return _penThreadPool.GetPenThreadForPenContextHelper(penContext); // Adds to weak ref list if creating new one. } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] private List_penThreadWeakRefList; ///////////////////////////////////////////////////////////////////// /// /// /// ////// Critical - Initializes critical data: m_PenThreads /// /// [SecurityCritical] internal PenThreadPool() { _penThreadWeakRefList = new List(); } /// /// Critical - Calls SecurityCritical code (PenThread constructor). /// Called by BeginService. /// TreatAsSafe boundry is Stylus.EnableCore, Stylus.RegisterHwndForInput /// and HwndWrapperHook class (via HwndSource.InputFilterMessage). /// [SecurityCritical] private PenThread GetPenThreadForPenContextHelper(PenContext penContext) { bool needCleanup = false; PenThread penThread = null; int i; // Scan existing penthreads to see if we have an available slot for context. for (i=0; i < _penThreadWeakRefList.Count; i++) { PenThread penThreadFound = _penThreadWeakRefList[i].Target as PenThread; if (penThreadFound == null) { needCleanup = true; } else { // See if we can use this one if (penContext == null || penThreadFound.AddPenContext(penContext)) { // We can use this one. penThread = penThreadFound; break; } } } if (needCleanup) { // prune invalid refs for (i=_penThreadWeakRefList.Count - 1; i >= 0; i--) { if (_penThreadWeakRefList[i].Target == null) { _penThreadWeakRefList.RemoveAt(i); } } } if (penThread == null) { penThread = new PenThread(); // Make sure we add this context to the penthread if (penContext != null) { penThread.AddPenContext(penContext); } _penThreadWeakRefList.Add(new WeakReference(penThread)); } return penThread; } } } // 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
- NonNullItemCollection.cs
- SQLByte.cs
- SHA256CryptoServiceProvider.cs
- Expression.cs
- FragmentQuery.cs
- CodeDelegateInvokeExpression.cs
- OperatorExpressions.cs
- RegexTree.cs
- TemplateBindingExtension.cs
- RectAnimation.cs
- SimpleRecyclingCache.cs
- EditingCommands.cs
- DataGridViewTextBoxColumn.cs
- WeakHashtable.cs
- SiteMapDataSource.cs
- SelectionGlyph.cs
- XmlTypeMapping.cs
- CodeObject.cs
- KeySpline.cs
- GifBitmapDecoder.cs
- OrthographicCamera.cs
- EdmPropertyAttribute.cs
- tibetanshape.cs
- WorkerRequest.cs
- ListComponentEditor.cs
- PathData.cs
- Divide.cs
- SessionEndedEventArgs.cs
- ChameleonKey.cs
- WindowsScrollBarBits.cs
- Listbox.cs
- _HelperAsyncResults.cs
- TargetConverter.cs
- TextRangeEditLists.cs
- VirtualizingStackPanel.cs
- PropertyDescriptorCollection.cs
- FileDialogCustomPlacesCollection.cs
- counter.cs
- XPathQueryGenerator.cs
- DispatchWrapper.cs
- HtmlMeta.cs
- ConfigXmlAttribute.cs
- Exceptions.cs
- EncryptedKeyIdentifierClause.cs
- EntityDescriptor.cs
- DetailsViewInsertEventArgs.cs
- WebHttpBindingElement.cs
- storepermissionattribute.cs
- LassoSelectionBehavior.cs
- ButtonColumn.cs
- PerfCounterSection.cs
- Script.cs
- BitStream.cs
- TemplateModeChangedEventArgs.cs
- D3DImage.cs
- SoapTransportImporter.cs
- CodeIndexerExpression.cs
- HttpCacheParams.cs
- WorkItem.cs
- SqlWorkflowPersistenceService.cs
- TextParentUndoUnit.cs
- TemplateComponentConnector.cs
- TableItemStyle.cs
- SignatureToken.cs
- ParentQuery.cs
- EasingKeyFrames.cs
- SimpleModelProvider.cs
- XmlSchemaProviderAttribute.cs
- AutoSizeToolBoxItem.cs
- SafeNativeMethodsCLR.cs
- WmlFormAdapter.cs
- XmlDocumentType.cs
- PolyQuadraticBezierSegment.cs
- ImageBrush.cs
- Solver.cs
- Point3DCollectionConverter.cs
- ObjectConverter.cs
- DataGridViewDataErrorEventArgs.cs
- DispatchChannelSink.cs
- ImageButton.cs
- ElementMarkupObject.cs
- DragDeltaEventArgs.cs
- AddInBase.cs
- CallTemplateAction.cs
- InlineUIContainer.cs
- Literal.cs
- DBPropSet.cs
- SQLDouble.cs
- MessageFilterException.cs
- DisplayNameAttribute.cs
- GenericsInstances.cs
- ExternalFile.cs
- ExtractedStateEntry.cs
- HtmlTableRowCollection.cs
- ScrollBar.cs
- XmlRootAttribute.cs
- X509ChainPolicy.cs
- TreeNodeSelectionProcessor.cs
- OleDbMetaDataFactory.cs
- Rotation3DAnimation.cs