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
- ToolStripItemCollection.cs
- QuaternionKeyFrameCollection.cs
- EditingCoordinator.cs
- SafeLibraryHandle.cs
- DataGridCommandEventArgs.cs
- Line.cs
- CompressedStack.cs
- WebConfigurationManager.cs
- XmlSchemaCollection.cs
- Point3D.cs
- NumericExpr.cs
- CookieParameter.cs
- DateTimeFormat.cs
- PauseStoryboard.cs
- ForEachAction.cs
- BindingOperations.cs
- ComIntegrationManifestGenerator.cs
- FlowLayoutSettings.cs
- ObjectDataSourceDisposingEventArgs.cs
- HtmlEmptyTagControlBuilder.cs
- MachineSettingsSection.cs
- ToolStripItemImageRenderEventArgs.cs
- Vector.cs
- KeyConverter.cs
- PersonalizationStateInfoCollection.cs
- XPathNode.cs
- HTTPAPI_VERSION.cs
- InvokeMethodActivity.cs
- ObservableCollection.cs
- NativeMethods.cs
- Column.cs
- InfoCardKeyedHashAlgorithm.cs
- FactoryGenerator.cs
- SqlFunctionAttribute.cs
- VideoDrawing.cs
- QilPatternFactory.cs
- NonParentingControl.cs
- StrongNameIdentityPermission.cs
- DataGridCellInfo.cs
- NameValuePermission.cs
- MenuItemCollection.cs
- PersonalizationProviderCollection.cs
- QuadTree.cs
- DescriptionCreator.cs
- ImmutableDispatchRuntime.cs
- ExceptionHandlersDesigner.cs
- SystemKeyConverter.cs
- RegexStringValidatorAttribute.cs
- SspiWrapper.cs
- OutputCacheEntry.cs
- BinaryMethodMessage.cs
- MSHTMLHost.cs
- HtmlGenericControl.cs
- DockEditor.cs
- LiteralSubsegment.cs
- PropertyChangeTracker.cs
- TokenDescriptor.cs
- WS2007FederationHttpBindingCollectionElement.cs
- BooleanConverter.cs
- HttpServerVarsCollection.cs
- User.cs
- TypeTypeConverter.cs
- DataTemplateSelector.cs
- SignedXml.cs
- DataReceivedEventArgs.cs
- StorageComplexTypeMapping.cs
- DataSourceGroupCollection.cs
- RequestDescription.cs
- TextEffectResolver.cs
- DetailsViewRowCollection.cs
- QueryLifecycle.cs
- SafeCryptContextHandle.cs
- DebugView.cs
- securitymgrsite.cs
- COAUTHIDENTITY.cs
- AsyncOperationManager.cs
- RegistrationServices.cs
- DataControlReference.cs
- SvcMapFile.cs
- ToolboxBitmapAttribute.cs
- DataObjectFieldAttribute.cs
- DbTransaction.cs
- FactoryGenerator.cs
- CommandLibraryHelper.cs
- ClonableStack.cs
- TraceSwitch.cs
- ProxyGenerationError.cs
- ListParagraph.cs
- ThreadExceptionDialog.cs
- RegexCharClass.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- BaseValidator.cs
- AnimationLayer.cs
- CellPartitioner.cs
- LinkArea.cs
- SqlGenerator.cs
- COM2IPerPropertyBrowsingHandler.cs
- PropertyGridEditorPart.cs
- TextParaLineResult.cs
- ManagedWndProcTracker.cs