Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- CalendarDay.cs
- GcHandle.cs
- ExpressionWriter.cs
- VirtualizedContainerService.cs
- SqlWebEventProvider.cs
- PropertyInformationCollection.cs
- FederatedMessageSecurityOverHttpElement.cs
- TextSearch.cs
- ListSourceHelper.cs
- HWStack.cs
- DecimalConstantAttribute.cs
- DiagnosticTraceSource.cs
- CngUIPolicy.cs
- BindingsCollection.cs
- TextBoxView.cs
- GiveFeedbackEvent.cs
- NativeDirectoryServicesQueryAPIs.cs
- PrinterUnitConvert.cs
- RegexCapture.cs
- XmlParserContext.cs
- IMembershipProvider.cs
- UnsafeNativeMethodsPenimc.cs
- ISFTagAndGuidCache.cs
- ListSourceHelper.cs
- InplaceBitmapMetadataWriter.cs
- ComplexBindingPropertiesAttribute.cs
- ConnectionConsumerAttribute.cs
- DoubleLink.cs
- InternalBufferOverflowException.cs
- ObjectMemberMapping.cs
- MemoryMappedView.cs
- HTTPNotFoundHandler.cs
- SqlResolver.cs
- WsatProxy.cs
- DataSpaceManager.cs
- AccessorTable.cs
- BuildProvider.cs
- XPathDescendantIterator.cs
- OperationBehaviorAttribute.cs
- DocumentViewerBase.cs
- GetWorkflowTree.cs
- SerializableAttribute.cs
- DataView.cs
- GcHandle.cs
- InternalConfigSettingsFactory.cs
- HttpListenerException.cs
- InfoCardXmlSerializer.cs
- ResourcesChangeInfo.cs
- UserControlAutomationPeer.cs
- PolicyException.cs
- StylusOverProperty.cs
- InputScopeConverter.cs
- TailCallAnalyzer.cs
- ApplicationContext.cs
- SqlRemoveConstantOrderBy.cs
- BamlResourceContent.cs
- EtwTrace.cs
- CodeNamespaceImportCollection.cs
- CacheHelper.cs
- CharEnumerator.cs
- IPipelineRuntime.cs
- AggregateNode.cs
- PolicyLevel.cs
- LinqDataSourceEditData.cs
- LabelAutomationPeer.cs
- COSERVERINFO.cs
- WizardPanel.cs
- InteropTrackingRecord.cs
- DesignConnection.cs
- LifetimeServices.cs
- IPGlobalProperties.cs
- Rect.cs
- Thumb.cs
- GridLengthConverter.cs
- ServiceOperationParameter.cs
- ThreadStartException.cs
- DispatchWrapper.cs
- WorkflowInlining.cs
- bindurihelper.cs
- CodeAssignStatement.cs
- ZoneMembershipCondition.cs
- SqlDataSourceFilteringEventArgs.cs
- DebugController.cs
- ComplexLine.cs
- ResXResourceReader.cs
- MailBnfHelper.cs
- ObjectNotFoundException.cs
- BindingGroup.cs
- BamlRecords.cs
- XmlEventCache.cs
- ControlParameter.cs
- Model3DCollection.cs
- SequentialWorkflowRootDesigner.cs
- FontCacheUtil.cs
- StreamGeometry.cs
- Overlapped.cs
- XmlCharCheckingWriter.cs
- ByteStack.cs
- PreparingEnlistment.cs
- ObjectItemCollection.cs