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
- CodeVariableDeclarationStatement.cs
- WarningException.cs
- AssociationSet.cs
- ProxyWebPartManagerDesigner.cs
- Int32KeyFrameCollection.cs
- HttpServerVarsCollection.cs
- SmtpTransport.cs
- ContentTextAutomationPeer.cs
- LinqDataSourceDeleteEventArgs.cs
- FaultContractAttribute.cs
- DbConnectionPoolOptions.cs
- SHA1CryptoServiceProvider.cs
- StackOverflowException.cs
- DropDownList.cs
- RectangleConverter.cs
- StrongName.cs
- SQLConvert.cs
- AssociationEndMember.cs
- RedirectionProxy.cs
- DisposableCollectionWrapper.cs
- SigningCredentials.cs
- MethodRental.cs
- TimelineCollection.cs
- XmlSerializerSection.cs
- WorkflowRuntime.cs
- SqlDelegatedTransaction.cs
- ObjectStateManager.cs
- SharedPersonalizationStateInfo.cs
- RegexWorker.cs
- StringBuilder.cs
- QuaternionAnimation.cs
- WebScriptMetadataFormatter.cs
- XamlSerializerUtil.cs
- ButtonChrome.cs
- DefaultValueAttribute.cs
- OracleCommand.cs
- WinFormsSecurity.cs
- ICspAsymmetricAlgorithm.cs
- TableRow.cs
- StrokeDescriptor.cs
- CodeGeneratorOptions.cs
- HotSpotCollection.cs
- objectresult_tresulttype.cs
- IsolatedStorageException.cs
- ComponentDispatcher.cs
- PathData.cs
- ObjectQueryState.cs
- SortQuery.cs
- ValidatorCollection.cs
- ListViewInsertEventArgs.cs
- HandleCollector.cs
- FixedDocument.cs
- XmlComment.cs
- TraceHandler.cs
- MonthChangedEventArgs.cs
- TextContainerChangeEventArgs.cs
- IdentifierCreationService.cs
- TabletCollection.cs
- DynamicResourceExtension.cs
- SQLBytesStorage.cs
- LocalizedNameDescriptionPair.cs
- Converter.cs
- unitconverter.cs
- SwitchElementsCollection.cs
- ThreadAttributes.cs
- OdbcDataAdapter.cs
- WindowsListViewItem.cs
- ListViewCancelEventArgs.cs
- BridgeDataRecord.cs
- DBNull.cs
- ImageListDesigner.cs
- BulletChrome.cs
- VisualTreeHelper.cs
- AuthenticationModuleElement.cs
- EncryptedData.cs
- FullTextBreakpoint.cs
- SafeCryptoHandles.cs
- Array.cs
- OLEDB_Enum.cs
- Parsers.cs
- UInt32Converter.cs
- ListBoxAutomationPeer.cs
- ApplicationException.cs
- WebBrowserUriTypeConverter.cs
- SchemaImporterExtensionsSection.cs
- BooleanFunctions.cs
- ImageFormatConverter.cs
- Attributes.cs
- EventLogPermissionEntryCollection.cs
- SuppressMergeCheckAttribute.cs
- RequestStatusBarUpdateEventArgs.cs
- LicFileLicenseProvider.cs
- Timer.cs
- ItemsControl.cs
- DataGridColumnEventArgs.cs
- OptimalBreakSession.cs
- SkipStoryboardToFill.cs
- WebHttpSecurityModeHelper.cs
- ScriptDescriptor.cs
- SrgsToken.cs