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
- XmlDocumentSurrogate.cs
- ResolveDuplexCD1AsyncResult.cs
- DbMetaDataFactory.cs
- PackageStore.cs
- PageBuildProvider.cs
- CategoryGridEntry.cs
- CacheForPrimitiveTypes.cs
- BamlTreeMap.cs
- CodeArrayIndexerExpression.cs
- TrimSurroundingWhitespaceAttribute.cs
- PersistenceMetadataNamespace.cs
- CodeSnippetCompileUnit.cs
- PreservationFileReader.cs
- CodeCatchClause.cs
- prefixendpointaddressmessagefilter.cs
- TraceShell.cs
- CharacterString.cs
- ExtensionDataObject.cs
- EdmToObjectNamespaceMap.cs
- Popup.cs
- WorkflowTraceTransfer.cs
- DataIdProcessor.cs
- TemplatedAdorner.cs
- Roles.cs
- AuthenticatingEventArgs.cs
- XmlHierarchicalDataSourceView.cs
- ToolStripDropTargetManager.cs
- ToolboxDataAttribute.cs
- SafeLibraryHandle.cs
- ObjectItemLoadingSessionData.cs
- XMLSyntaxException.cs
- HealthMonitoringSectionHelper.cs
- PrintControllerWithStatusDialog.cs
- ClientSettingsSection.cs
- XmlWrappingWriter.cs
- MethodBody.cs
- BinHexEncoding.cs
- EntityTypeEmitter.cs
- Int32Collection.cs
- BufferedReadStream.cs
- CDSCollectionETWBCLProvider.cs
- InputLangChangeEvent.cs
- XmlIgnoreAttribute.cs
- ToolStripItemClickedEventArgs.cs
- UTF7Encoding.cs
- TranslateTransform3D.cs
- Exception.cs
- base64Transforms.cs
- BitmapSource.cs
- MatrixTransform.cs
- WebBrowserBase.cs
- TemplatedWizardStep.cs
- FixedSOMTable.cs
- QilIterator.cs
- Mouse.cs
- ScriptReferenceEventArgs.cs
- XmlConvert.cs
- StyleHelper.cs
- SQLCharsStorage.cs
- AVElementHelper.cs
- UniqueEventHelper.cs
- RandomNumberGenerator.cs
- ColumnCollectionEditor.cs
- DataGridView.cs
- EntityWithChangeTrackerStrategy.cs
- RenderingEventArgs.cs
- SettingsContext.cs
- DrawTreeNodeEventArgs.cs
- NamespaceEmitter.cs
- TypeConstant.cs
- RegisteredScript.cs
- PerformanceCounterPermission.cs
- AuthenticateEventArgs.cs
- UrlMappingCollection.cs
- HTMLTagNameToTypeMapper.cs
- SystemThemeKey.cs
- IndependentAnimationStorage.cs
- EntityViewGenerationAttribute.cs
- ObjectIDGenerator.cs
- File.cs
- XmlUtf8RawTextWriter.cs
- Main.cs
- DBSchemaRow.cs
- SmtpClient.cs
- FlowDocumentReaderAutomationPeer.cs
- SQLByte.cs
- ByteStream.cs
- FileLevelControlBuilderAttribute.cs
- RectangleF.cs
- ButtonFieldBase.cs
- BitmapEffectDrawing.cs
- ModelVisual3D.cs
- SharedPerformanceCounter.cs
- LayoutTableCell.cs
- MethodExpr.cs
- _CacheStreams.cs
- DataPagerFieldCommandEventArgs.cs
- WebBaseEventKeyComparer.cs
- DataProtection.cs
- SafeArrayRankMismatchException.cs