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
- odbcmetadatafactory.cs
- XmlAttributeOverrides.cs
- TcpSocketManager.cs
- ToolStripPanelRow.cs
- SystemUnicastIPAddressInformation.cs
- AliasedSlot.cs
- TemplateControlParser.cs
- AssertSection.cs
- SrgsItemList.cs
- hebrewshape.cs
- HttpResponse.cs
- DesignerLoader.cs
- ExecutionEngineException.cs
- MessageBox.cs
- SQLChars.cs
- PeerApplicationLaunchInfo.cs
- ColorMatrix.cs
- ExceptionUtil.cs
- AstTree.cs
- UseLicense.cs
- XMLDiffLoader.cs
- ValidationError.cs
- NullableBoolConverter.cs
- ReadOnlyCollectionBase.cs
- querybuilder.cs
- RectIndependentAnimationStorage.cs
- remotingproxy.cs
- InfoCardArgumentException.cs
- COAUTHIDENTITY.cs
- EventMap.cs
- ClassHandlersStore.cs
- CodeTypeMemberCollection.cs
- SqlGenericUtil.cs
- Matrix3DStack.cs
- Rule.cs
- AutomationPatternInfo.cs
- SqlDataSourceCache.cs
- HttpHandlersSection.cs
- EntityViewGenerationAttribute.cs
- HuffModule.cs
- StorageScalarPropertyMapping.cs
- Int32RectConverter.cs
- AuthenticationModulesSection.cs
- SkinIDTypeConverter.cs
- JsonServiceDocumentSerializer.cs
- GPRECT.cs
- DataGridViewComboBoxEditingControl.cs
- OracleDataAdapter.cs
- Double.cs
- _DigestClient.cs
- GeometryModel3D.cs
- ToolboxItemCollection.cs
- DataContractSerializer.cs
- GeneralTransform3DGroup.cs
- RequestTimeoutManager.cs
- ExtensionSurface.cs
- DefaultSerializationProviderAttribute.cs
- HttpServerVarsCollection.cs
- ConfigXmlSignificantWhitespace.cs
- NumberAction.cs
- ViewEvent.cs
- ProcessProtocolHandler.cs
- FileVersionInfo.cs
- XmlDocumentFragment.cs
- PrivilegeNotHeldException.cs
- Symbol.cs
- StoreAnnotationsMap.cs
- ApplicationManager.cs
- SQLGuidStorage.cs
- CatalogZone.cs
- DataRow.cs
- TransformValueSerializer.cs
- SqlCacheDependency.cs
- CreateDataSourceDialog.cs
- ReliableMessagingHelpers.cs
- Context.cs
- PeerNearMe.cs
- DesignOnlyAttribute.cs
- ThreadExceptionEvent.cs
- TextChange.cs
- SettingsSavedEventArgs.cs
- MemoryMappedViewStream.cs
- PropertyChangeTracker.cs
- XPathNavigator.cs
- WebBrowserPermission.cs
- ModelPerspective.cs
- RealProxy.cs
- ActivityInterfaces.cs
- IOException.cs
- HighlightVisual.cs
- SaveWorkflowAsyncResult.cs
- ToolCreatedEventArgs.cs
- AssemblyHash.cs
- TdsParserHelperClasses.cs
- _IPv6Address.cs
- SimpleHandlerFactory.cs
- FrugalList.cs
- CodeDirectoryCompiler.cs
- Currency.cs
- CodeTypeParameter.cs