Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / System / Windows / Input / Stylus / PenThreadPool.cs / 1 / 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
- SmiContext.cs
- CommandHelpers.cs
- InfoCardXmlSerializer.cs
- InstanceDescriptor.cs
- shaperfactoryquerycacheentry.cs
- GenericArgumentsUpdater.cs
- unsafenativemethodstextservices.cs
- KeyGestureValueSerializer.cs
- Frame.cs
- XsltContext.cs
- PackWebRequest.cs
- StreamResourceInfo.cs
- TypeConstant.cs
- Canonicalizers.cs
- ButtonRenderer.cs
- WebPartManager.cs
- WrappedIUnknown.cs
- WizardPanelChangingEventArgs.cs
- ToolStripSplitStackLayout.cs
- DataSourceCache.cs
- EntityContainerRelationshipSet.cs
- AutomationPatternInfo.cs
- ListView.cs
- FieldMetadata.cs
- CustomExpressionEventArgs.cs
- CreateParams.cs
- RuleInfoComparer.cs
- CompilerParameters.cs
- DistributedTransactionPermission.cs
- WindowsHyperlink.cs
- FormatConvertedBitmap.cs
- DoubleLinkList.cs
- ContextMenuService.cs
- MeasureItemEvent.cs
- TransportContext.cs
- EventHandlersStore.cs
- CodeStatement.cs
- TextSpan.cs
- XmlCharType.cs
- TextTreeUndoUnit.cs
- LinkDescriptor.cs
- PackWebResponse.cs
- ServerIdentity.cs
- DetailsViewInsertEventArgs.cs
- SByteConverter.cs
- BooleanToVisibilityConverter.cs
- IPGlobalProperties.cs
- Function.cs
- XmlReflectionMember.cs
- Operators.cs
- ByteAnimationUsingKeyFrames.cs
- StringFormat.cs
- MultipartIdentifier.cs
- SpeakCompletedEventArgs.cs
- DateTimeConverter.cs
- ObjectConverter.cs
- ScaleTransform.cs
- XmlQuerySequence.cs
- ControlType.cs
- PathFigure.cs
- SocketException.cs
- CodeAttributeArgument.cs
- ServiceParser.cs
- TileBrush.cs
- DrawingBrush.cs
- OleDbRowUpdatedEvent.cs
- UserControl.cs
- OletxTransactionManager.cs
- DbMetaDataFactory.cs
- SwitchAttribute.cs
- TransactionFilter.cs
- ADRole.cs
- _Connection.cs
- EntityViewGenerationAttribute.cs
- AttributeEmitter.cs
- MeasurementDCInfo.cs
- ControlBuilder.cs
- AVElementHelper.cs
- TripleDESCryptoServiceProvider.cs
- HandlerBase.cs
- FixedSOMSemanticBox.cs
- Evidence.cs
- CurrentChangingEventArgs.cs
- DictionaryItemsCollection.cs
- ScrollChrome.cs
- UnsafeNetInfoNativeMethods.cs
- StreamHelper.cs
- ApplicationActivator.cs
- PatternMatcher.cs
- TableRow.cs
- CookielessHelper.cs
- storepermissionattribute.cs
- ResetableIterator.cs
- TabletCollection.cs
- SqlDataSourceEnumerator.cs
- remotingproxy.cs
- FrameSecurityDescriptor.cs
- SafeArrayRankMismatchException.cs
- BindingExpressionUncommonField.cs
- AdCreatedEventArgs.cs