Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- TransferRequestHandler.cs
- ImageKeyConverter.cs
- LineSegment.cs
- SelectionRangeConverter.cs
- TypeExtensionConverter.cs
- AllMembershipCondition.cs
- PersonalizationStateQuery.cs
- MessagePropertyVariants.cs
- CheckBoxField.cs
- BaseDataListDesigner.cs
- InternalCache.cs
- Misc.cs
- FormViewUpdatedEventArgs.cs
- SqlReferenceCollection.cs
- SelectionProcessor.cs
- StretchValidation.cs
- DefaultWorkflowLoaderService.cs
- ScriptingRoleServiceSection.cs
- ButtonPopupAdapter.cs
- CodeMemberMethod.cs
- IEnumerable.cs
- PersonalizationStateInfo.cs
- ResourcesGenerator.cs
- TextMetrics.cs
- ReferenceEqualityComparer.cs
- ExpressionNormalizer.cs
- ClientApiGenerator.cs
- InkSerializer.cs
- Exceptions.cs
- DirectoryInfo.cs
- TraceInternal.cs
- LoginDesigner.cs
- PresentationSource.cs
- TreeNode.cs
- FaultDesigner.cs
- WebServiceMethodData.cs
- CollectionBuilder.cs
- Pen.cs
- _SslStream.cs
- DataGridHeadersVisibilityToVisibilityConverter.cs
- CssClassPropertyAttribute.cs
- RegistryDataKey.cs
- Stream.cs
- SqlSelectClauseBuilder.cs
- HashCodeCombiner.cs
- Stackframe.cs
- TypeRefElement.cs
- RawStylusInputReport.cs
- NativeRightsManagementAPIsStructures.cs
- MarshalDirectiveException.cs
- EntryPointNotFoundException.cs
- Input.cs
- MultiTargetingUtil.cs
- SlipBehavior.cs
- ExplicitDiscriminatorMap.cs
- ClockController.cs
- SafeWaitHandle.cs
- ADConnectionHelper.cs
- QilInvoke.cs
- FullTextBreakpoint.cs
- DataGridRelationshipRow.cs
- ManualResetEvent.cs
- Types.cs
- FixedSOMLineCollection.cs
- SessionIDManager.cs
- ComponentManagerBroker.cs
- StringSource.cs
- CTreeGenerator.cs
- ToolStripDropDownMenu.cs
- SystemSounds.cs
- Assembly.cs
- HtmlTextBoxAdapter.cs
- JournalEntry.cs
- KeyValuePairs.cs
- OdbcConnectionOpen.cs
- DocumentsTrace.cs
- ProofTokenCryptoHandle.cs
- UniqueIdentifierService.cs
- DesignerProperties.cs
- FilterableAttribute.cs
- MaskDesignerDialog.cs
- Stylesheet.cs
- Action.cs
- FixedPosition.cs
- FunctionDescription.cs
- TextParentUndoUnit.cs
- EntitySqlQueryCacheKey.cs
- Pkcs9Attribute.cs
- Inflater.cs
- MemberHolder.cs
- WebPartVerb.cs
- PagesSection.cs
- SqlDataSourceSelectingEventArgs.cs
- FixedSOMGroup.cs
- ThreadStartException.cs
- NumberAction.cs
- AccessDataSourceView.cs
- RegexWorker.cs
- ProfileManager.cs
- XmlSchemaChoice.cs