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
- BooleanAnimationUsingKeyFrames.cs
- ObjectTag.cs
- DesignerProperties.cs
- CompositionTarget.cs
- RelAssertionDirectKeyIdentifierClause.cs
- OracleParameter.cs
- SocketAddress.cs
- Int16.cs
- OuterProxyWrapper.cs
- InternalConfigHost.cs
- ModifiableIteratorCollection.cs
- ObjectViewQueryResultData.cs
- DetailsView.cs
- UrlEncodedParameterWriter.cs
- ReaderContextStackData.cs
- DrawingBrush.cs
- TableChangeProcessor.cs
- login.cs
- DebugView.cs
- FixUpCollection.cs
- WebPartConnectionsConnectVerb.cs
- base64Transforms.cs
- _ConnectOverlappedAsyncResult.cs
- PreservationFileWriter.cs
- WebPartMenuStyle.cs
- FormsAuthenticationModule.cs
- PrimarySelectionGlyph.cs
- ComponentResourceManager.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- Stylesheet.cs
- Renderer.cs
- ValueChangedEventManager.cs
- BigInt.cs
- CodeNamespaceImport.cs
- WindowAutomationPeer.cs
- DataBindingValueUIHandler.cs
- ReferenceList.cs
- ApplicationFileParser.cs
- WindowsFormsLinkLabel.cs
- ParameterElement.cs
- VisualStyleElement.cs
- XmlAttributeCollection.cs
- PersonalizationStateInfo.cs
- StrokeIntersection.cs
- XmlEncoding.cs
- UpdatePanelTrigger.cs
- DropSource.cs
- DataControlFieldCell.cs
- GenericTextProperties.cs
- AssemblyBuilder.cs
- SqlOuterApplyReducer.cs
- LocalBuilder.cs
- WaitHandle.cs
- WebResourceAttribute.cs
- DataSourceControl.cs
- PolygonHotSpot.cs
- ExclusiveCanonicalizationTransform.cs
- KeyNotFoundException.cs
- Content.cs
- Grant.cs
- AxisAngleRotation3D.cs
- SamlAudienceRestrictionCondition.cs
- DataComponentMethodGenerator.cs
- ObjectNavigationPropertyMapping.cs
- JsonFormatReaderGenerator.cs
- OutputCacheModule.cs
- AnnotationComponentChooser.cs
- DataGridViewHitTestInfo.cs
- ClientSideQueueItem.cs
- COM2ComponentEditor.cs
- ProfileProvider.cs
- ImageCodecInfo.cs
- CodeComment.cs
- DropDownList.cs
- InputLanguageCollection.cs
- DoubleAnimationClockResource.cs
- ACL.cs
- SharedStatics.cs
- StylusPointPropertyInfoDefaults.cs
- ConfigXmlElement.cs
- KnownBoxes.cs
- LinkClickEvent.cs
- SoapAttributeOverrides.cs
- MessagePropertyVariants.cs
- TransactionBridgeSection.cs
- CommentEmitter.cs
- HostingEnvironmentSection.cs
- RefType.cs
- SettingsAttributeDictionary.cs
- QueuePropertyVariants.cs
- BaseTemplateParser.cs
- Mapping.cs
- RowsCopiedEventArgs.cs
- Fx.cs
- TopClause.cs
- RecognizerStateChangedEventArgs.cs
- MsmqIntegrationBindingElement.cs
- MemberRelationshipService.cs
- BitSet.cs
- CompareValidator.cs