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
- StateManagedCollection.cs
- CacheOutputQuery.cs
- XmlTypeMapping.cs
- Base64Encoding.cs
- AuthenticationService.cs
- GB18030Encoding.cs
- ToolStripPanelRow.cs
- PluralizationService.cs
- HandlerMappingMemo.cs
- GridEntry.cs
- AddDataControlFieldDialog.cs
- PersistenceTypeAttribute.cs
- StateMachineDesignerPaint.cs
- RawTextInputReport.cs
- WSFederationHttpSecurityMode.cs
- CodeGenerationManager.cs
- Filter.cs
- VirtualizingPanel.cs
- DataGridViewElement.cs
- BeginEvent.cs
- Ref.cs
- DBCSCodePageEncoding.cs
- CustomGrammar.cs
- HuffModule.cs
- GroupItemAutomationPeer.cs
- XmlAutoDetectWriter.cs
- UrlMappingsModule.cs
- WebPartDisplayModeCollection.cs
- LinqDataSourceUpdateEventArgs.cs
- DataGridDesigner.cs
- Point3DAnimationUsingKeyFrames.cs
- AddValidationError.cs
- EmptyCollection.cs
- Oci.cs
- GenericTypeParameterBuilder.cs
- MulticastNotSupportedException.cs
- EventSinkActivity.cs
- PointAnimationUsingKeyFrames.cs
- ComponentDispatcher.cs
- ExpressionHelper.cs
- RequestUriProcessor.cs
- ZoneMembershipCondition.cs
- OdbcError.cs
- Size3D.cs
- XmlSiteMapProvider.cs
- LoginView.cs
- WebPartConnectionCollection.cs
- ContentFilePart.cs
- TreeBuilder.cs
- TimeIntervalCollection.cs
- VisualStyleElement.cs
- RectValueSerializer.cs
- WindowsRichEditRange.cs
- SystemKeyConverter.cs
- ServiceThrottle.cs
- Stackframe.cs
- Int64.cs
- InkCollectionBehavior.cs
- TypeRefElement.cs
- ExpandSegmentCollection.cs
- TraceUtility.cs
- PassportAuthenticationEventArgs.cs
- FileVersion.cs
- Latin1Encoding.cs
- QilInvokeLateBound.cs
- ActivityWithResult.cs
- BlurBitmapEffect.cs
- SqlNodeAnnotation.cs
- SiteMapNodeItemEventArgs.cs
- ipaddressinformationcollection.cs
- ScrollData.cs
- TextEndOfLine.cs
- NetNamedPipeSecurity.cs
- QuadraticBezierSegment.cs
- SafeTimerHandle.cs
- ToggleButton.cs
- HttpResponse.cs
- UrlMappingsModule.cs
- MultiByteCodec.cs
- FixedSOMImage.cs
- ReadOnlyCollectionBase.cs
- EntityDataSourceContainerNameConverter.cs
- Bidi.cs
- ProfileSettingsCollection.cs
- WebConfigurationManager.cs
- TypeElement.cs
- GlyphElement.cs
- ExtendedPropertyInfo.cs
- MissingMethodException.cs
- PathFigureCollectionConverter.cs
- RtfFormatStack.cs
- ConstructorBuilder.cs
- GcHandle.cs
- SHA512.cs
- PersistenceParticipant.cs
- SoapEnumAttribute.cs
- SizeChangedInfo.cs
- SystemResourceKey.cs
- OdbcError.cs
- RegexCapture.cs