Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Monitoring / system / Diagnosticts / ProcessThread.cs / 1305376 / ProcessThread.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Diagnostics { using System.Threading; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System; using System.Collections; using System.IO; using Microsoft.Win32; using System.Security.Permissions; using Microsoft.Win32.SafeHandles; using System.Runtime.Versioning; // using System.Windows.Forms; ////// [ Designer("System.Diagnostics.Design.ProcessThreadDesigner, " + AssemblyRef.SystemDesign), HostProtection(SelfAffectingProcessMgmt=true, SelfAffectingThreading=true) ] public class ProcessThread : Component { // // FIELDS // ThreadInfo threadInfo; bool isRemoteMachine; bool priorityBoostEnabled; bool havePriorityBoostEnabled; ThreadPriorityLevel priorityLevel; bool havePriorityLevel; // // CONSTRUCTORS // ////// Represents a Win32 thread. This can be used to obtain /// information about the thread, such as it's performance characteristics. This is /// returned from the System.Diagnostics.Process.ProcessThread property of the System.Diagnostics.Process component. /// ////// I don't understand /// the following comment associated with the previous sentence: "property of /// Process component " Rather than just "processTHread". There is no such /// member on Process. Do we mean 'threads'? /// ////// Internal constructor. /// ///[ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] internal ProcessThread(bool isRemoteMachine, ThreadInfo threadInfo) { this.isRemoteMachine = isRemoteMachine; this.threadInfo = threadInfo; GC.SuppressFinalize(this); } // // PROPERTIES // /// /// Returns the base priority of the thread which is computed by combining the /// process priority class with the priority level of the associated thread. /// [MonitoringDescription(SR.ThreadBasePriority)] public int BasePriority { get { return threadInfo.basePriority; } } ////// The current priority indicates the actual priority of the associated thread, /// which may deviate from the base priority based on how the OS is currently /// scheduling the thread. /// [MonitoringDescription(SR.ThreadCurrentPriority)] public int CurrentPriority { get { return threadInfo.currentPriority; } } ////// Returns the unique identifier for the associated thread. /// [MonitoringDescription(SR.ThreadId)] public int Id { [ResourceExposure(ResourceScope.Process)] get { return threadInfo.threadId; } } ////// [Browsable(false)] public int IdealProcessor { [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (NativeMethods.SetThreadIdealProcessor(threadHandle, value) < 0) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } } } ////// Sets the processor that this thread would ideally like to run on. /// ////// Returns or sets whether this thread would like a priority boost if the user interacts /// with user interface associated with this thread. /// [MonitoringDescription(SR.ThreadPriorityBoostEnabled)] public bool PriorityBoostEnabled { get { if (!havePriorityBoostEnabled) { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); bool disabled = false; if (!NativeMethods.GetThreadPriorityBoost(threadHandle, out disabled)) { throw new Win32Exception(); } priorityBoostEnabled = !disabled; havePriorityBoostEnabled = true; } finally { CloseThreadHandle(threadHandle); } } return priorityBoostEnabled; } set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (!NativeMethods.SetThreadPriorityBoost(threadHandle, !value)) throw new Win32Exception(); priorityBoostEnabled = value; havePriorityBoostEnabled = true; } finally { CloseThreadHandle(threadHandle); } } } ////// Returns or sets the priority level of the associated thread. The priority level is /// not an absolute level, but instead contributes to the actual thread priority by /// considering the priority class of the process. /// [MonitoringDescription(SR.ThreadPriorityLevel)] public ThreadPriorityLevel PriorityLevel { get { if (!havePriorityLevel) { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); int value = NativeMethods.GetThreadPriority(threadHandle); if (value == 0x7fffffff) { throw new Win32Exception(); } priorityLevel = (ThreadPriorityLevel)value; havePriorityLevel = true; } finally { CloseThreadHandle(threadHandle); } } return priorityLevel; } [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (!NativeMethods.SetThreadPriority(threadHandle, (int)value)) { throw new Win32Exception(); } priorityLevel = value; } finally { CloseThreadHandle(threadHandle); } } } ////// Returns the amount of time the thread has spent running code inside the operating /// system core. /// [MonitoringDescription(SR.ThreadPrivilegedProcessorTime)] public TimeSpan PrivilegedProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().PrivilegedProcessorTime; } } ////// Returns the memory address of the function that was called when the associated /// thread was started. /// [MonitoringDescription(SR.ThreadStartAddress)] public IntPtr StartAddress { get { EnsureState(State.IsNt); return threadInfo.startAddress; } } ////// Returns the time the associated thread was started. /// [MonitoringDescription(SR.ThreadStartTime)] public DateTime StartTime { get { EnsureState(State.IsNt); return GetThreadTimes().StartTime; } } ////// Returns the current state of the associated thread, e.g. is it running, waiting, etc. /// [MonitoringDescription(SR.ThreadThreadState)] public ThreadState ThreadState { get { EnsureState(State.IsNt); return threadInfo.threadState; } } ////// Returns the amount of time the associated thread has spent utilizing the CPU. /// It is the sum of the System.Diagnostics.ProcessThread.UserProcessorTime and /// System.Diagnostics.ProcessThread.PrivilegedProcessorTime. /// [MonitoringDescription(SR.ThreadTotalProcessorTime)] public TimeSpan TotalProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().TotalProcessorTime; } } ////// Returns the amount of time the associated thread has spent running code /// inside the application (not the operating system core). /// [MonitoringDescription(SR.ThreadUserProcessorTime)] public TimeSpan UserProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().UserProcessorTime; } } ////// Returns the reason the associated thread is waiting, if any. /// [MonitoringDescription(SR.ThreadWaitReason)] public ThreadWaitReason WaitReason { get { EnsureState(State.IsNt); if (threadInfo.threadState != ThreadState.Wait) { throw new InvalidOperationException(SR.GetString(SR.WaitReasonUnavailable)); } return threadInfo.threadWaitReason; } } // // METHODS // ////// Helper to close a thread handle. /// ///private static void CloseThreadHandle(SafeThreadHandle handle) { if (handle != null) { handle.Close(); } } /// /// Helper to check preconditions for property access. /// void EnsureState(State state) { if ( ((state & State.IsLocal) != (State)0) && isRemoteMachine) { throw new NotSupportedException(SR.GetString(SR.NotSupportedRemoteThread)); } if ((state & State.IsNt) != (State)0) { if (Environment.OSVersion.Platform != PlatformID.Win32NT) { throw new PlatformNotSupportedException(SR.GetString(SR.WinNTRequired)); } } } ////// Helper to open a thread handle. /// ///[ResourceExposure(ResourceScope.None)] // Scoped by threadId [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] SafeThreadHandle OpenThreadHandle(int access) { EnsureState(State.IsLocal); return ProcessManager.OpenThread(threadInfo.threadId, access); } /// /// Resets the ideal processor so there is no ideal processor for this thread (e.g. /// any processor is ideal). /// [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void ResetIdealProcessor() { // 32 means "any processor is fine" IdealProcessor = 32; } ////// Sets which processors the associated thread is allowed to be scheduled to run on. /// Each processor is represented as a bit: bit 0 is processor one, bit 1 is processor /// two, etc. For example, the value 1 means run on processor one, 2 means run on /// processor two, 3 means run on processor one or two. /// [Browsable(false)] public IntPtr ProcessorAffinity { [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION | NativeMethods.THREAD_QUERY_INFORMATION); if (NativeMethods.SetThreadAffinityMask(threadHandle, new HandleRef(this, value)) == IntPtr.Zero) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } } } private ProcessThreadTimes GetThreadTimes() { ProcessThreadTimes threadTimes = new ProcessThreadTimes(); SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); if (!NativeMethods.GetThreadTimes(threadHandle, out threadTimes.create, out threadTimes.exit, out threadTimes.kernel, out threadTimes.user)) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } return threadTimes; } ////// Preconditions for accessing properties. /// ///enum State { IsLocal = 0x2, IsNt = 0x4 } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Diagnostics { using System.Threading; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System; using System.Collections; using System.IO; using Microsoft.Win32; using System.Security.Permissions; using Microsoft.Win32.SafeHandles; using System.Runtime.Versioning; // using System.Windows.Forms; ////// [ Designer("System.Diagnostics.Design.ProcessThreadDesigner, " + AssemblyRef.SystemDesign), HostProtection(SelfAffectingProcessMgmt=true, SelfAffectingThreading=true) ] public class ProcessThread : Component { // // FIELDS // ThreadInfo threadInfo; bool isRemoteMachine; bool priorityBoostEnabled; bool havePriorityBoostEnabled; ThreadPriorityLevel priorityLevel; bool havePriorityLevel; // // CONSTRUCTORS // ////// Represents a Win32 thread. This can be used to obtain /// information about the thread, such as it's performance characteristics. This is /// returned from the System.Diagnostics.Process.ProcessThread property of the System.Diagnostics.Process component. /// ////// I don't understand /// the following comment associated with the previous sentence: "property of /// Process component " Rather than just "processTHread". There is no such /// member on Process. Do we mean 'threads'? /// ////// Internal constructor. /// ///[ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] internal ProcessThread(bool isRemoteMachine, ThreadInfo threadInfo) { this.isRemoteMachine = isRemoteMachine; this.threadInfo = threadInfo; GC.SuppressFinalize(this); } // // PROPERTIES // /// /// Returns the base priority of the thread which is computed by combining the /// process priority class with the priority level of the associated thread. /// [MonitoringDescription(SR.ThreadBasePriority)] public int BasePriority { get { return threadInfo.basePriority; } } ////// The current priority indicates the actual priority of the associated thread, /// which may deviate from the base priority based on how the OS is currently /// scheduling the thread. /// [MonitoringDescription(SR.ThreadCurrentPriority)] public int CurrentPriority { get { return threadInfo.currentPriority; } } ////// Returns the unique identifier for the associated thread. /// [MonitoringDescription(SR.ThreadId)] public int Id { [ResourceExposure(ResourceScope.Process)] get { return threadInfo.threadId; } } ////// [Browsable(false)] public int IdealProcessor { [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (NativeMethods.SetThreadIdealProcessor(threadHandle, value) < 0) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } } } ////// Sets the processor that this thread would ideally like to run on. /// ////// Returns or sets whether this thread would like a priority boost if the user interacts /// with user interface associated with this thread. /// [MonitoringDescription(SR.ThreadPriorityBoostEnabled)] public bool PriorityBoostEnabled { get { if (!havePriorityBoostEnabled) { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); bool disabled = false; if (!NativeMethods.GetThreadPriorityBoost(threadHandle, out disabled)) { throw new Win32Exception(); } priorityBoostEnabled = !disabled; havePriorityBoostEnabled = true; } finally { CloseThreadHandle(threadHandle); } } return priorityBoostEnabled; } set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (!NativeMethods.SetThreadPriorityBoost(threadHandle, !value)) throw new Win32Exception(); priorityBoostEnabled = value; havePriorityBoostEnabled = true; } finally { CloseThreadHandle(threadHandle); } } } ////// Returns or sets the priority level of the associated thread. The priority level is /// not an absolute level, but instead contributes to the actual thread priority by /// considering the priority class of the process. /// [MonitoringDescription(SR.ThreadPriorityLevel)] public ThreadPriorityLevel PriorityLevel { get { if (!havePriorityLevel) { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); int value = NativeMethods.GetThreadPriority(threadHandle); if (value == 0x7fffffff) { throw new Win32Exception(); } priorityLevel = (ThreadPriorityLevel)value; havePriorityLevel = true; } finally { CloseThreadHandle(threadHandle); } } return priorityLevel; } [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION); if (!NativeMethods.SetThreadPriority(threadHandle, (int)value)) { throw new Win32Exception(); } priorityLevel = value; } finally { CloseThreadHandle(threadHandle); } } } ////// Returns the amount of time the thread has spent running code inside the operating /// system core. /// [MonitoringDescription(SR.ThreadPrivilegedProcessorTime)] public TimeSpan PrivilegedProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().PrivilegedProcessorTime; } } ////// Returns the memory address of the function that was called when the associated /// thread was started. /// [MonitoringDescription(SR.ThreadStartAddress)] public IntPtr StartAddress { get { EnsureState(State.IsNt); return threadInfo.startAddress; } } ////// Returns the time the associated thread was started. /// [MonitoringDescription(SR.ThreadStartTime)] public DateTime StartTime { get { EnsureState(State.IsNt); return GetThreadTimes().StartTime; } } ////// Returns the current state of the associated thread, e.g. is it running, waiting, etc. /// [MonitoringDescription(SR.ThreadThreadState)] public ThreadState ThreadState { get { EnsureState(State.IsNt); return threadInfo.threadState; } } ////// Returns the amount of time the associated thread has spent utilizing the CPU. /// It is the sum of the System.Diagnostics.ProcessThread.UserProcessorTime and /// System.Diagnostics.ProcessThread.PrivilegedProcessorTime. /// [MonitoringDescription(SR.ThreadTotalProcessorTime)] public TimeSpan TotalProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().TotalProcessorTime; } } ////// Returns the amount of time the associated thread has spent running code /// inside the application (not the operating system core). /// [MonitoringDescription(SR.ThreadUserProcessorTime)] public TimeSpan UserProcessorTime { get { EnsureState(State.IsNt); return GetThreadTimes().UserProcessorTime; } } ////// Returns the reason the associated thread is waiting, if any. /// [MonitoringDescription(SR.ThreadWaitReason)] public ThreadWaitReason WaitReason { get { EnsureState(State.IsNt); if (threadInfo.threadState != ThreadState.Wait) { throw new InvalidOperationException(SR.GetString(SR.WaitReasonUnavailable)); } return threadInfo.threadWaitReason; } } // // METHODS // ////// Helper to close a thread handle. /// ///private static void CloseThreadHandle(SafeThreadHandle handle) { if (handle != null) { handle.Close(); } } /// /// Helper to check preconditions for property access. /// void EnsureState(State state) { if ( ((state & State.IsLocal) != (State)0) && isRemoteMachine) { throw new NotSupportedException(SR.GetString(SR.NotSupportedRemoteThread)); } if ((state & State.IsNt) != (State)0) { if (Environment.OSVersion.Platform != PlatformID.Win32NT) { throw new PlatformNotSupportedException(SR.GetString(SR.WinNTRequired)); } } } ////// Helper to open a thread handle. /// ///[ResourceExposure(ResourceScope.None)] // Scoped by threadId [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] SafeThreadHandle OpenThreadHandle(int access) { EnsureState(State.IsLocal); return ProcessManager.OpenThread(threadInfo.threadId, access); } /// /// Resets the ideal processor so there is no ideal processor for this thread (e.g. /// any processor is ideal). /// [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void ResetIdealProcessor() { // 32 means "any processor is fine" IdealProcessor = 32; } ////// Sets which processors the associated thread is allowed to be scheduled to run on. /// Each processor is represented as a bit: bit 0 is processor one, bit 1 is processor /// two, etc. For example, the value 1 means run on processor one, 2 means run on /// processor two, 3 means run on processor one or two. /// [Browsable(false)] public IntPtr ProcessorAffinity { [ResourceExposure(ResourceScope.Process)] [ResourceConsumption(ResourceScope.Process)] set { SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_SET_INFORMATION | NativeMethods.THREAD_QUERY_INFORMATION); if (NativeMethods.SetThreadAffinityMask(threadHandle, new HandleRef(this, value)) == IntPtr.Zero) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } } } private ProcessThreadTimes GetThreadTimes() { ProcessThreadTimes threadTimes = new ProcessThreadTimes(); SafeThreadHandle threadHandle = null; try { threadHandle = OpenThreadHandle(NativeMethods.THREAD_QUERY_INFORMATION); if (!NativeMethods.GetThreadTimes(threadHandle, out threadTimes.create, out threadTimes.exit, out threadTimes.kernel, out threadTimes.user)) { throw new Win32Exception(); } } finally { CloseThreadHandle(threadHandle); } return threadTimes; } ////// Preconditions for accessing properties. /// ///enum State { IsLocal = 0x2, IsNt = 0x4 } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Native.cs
- TableLayoutSettings.cs
- HttpEncoderUtility.cs
- StringAnimationUsingKeyFrames.cs
- RepeatButtonAutomationPeer.cs
- SwitchAttribute.cs
- FieldInfo.cs
- UniqueIdentifierService.cs
- MergeFilterQuery.cs
- PickBranchDesigner.xaml.cs
- MenuItemStyleCollection.cs
- PrintControllerWithStatusDialog.cs
- ServiceHttpModule.cs
- DataServiceRequest.cs
- GeneralTransform3DCollection.cs
- CommittableTransaction.cs
- __Filters.cs
- LogWriteRestartAreaState.cs
- ScriptResourceDefinition.cs
- PageAsyncTask.cs
- GroupBox.cs
- DeploymentExceptionMapper.cs
- AutoGeneratedFieldProperties.cs
- HttpBindingExtension.cs
- IERequestCache.cs
- WorkflowPersistenceService.cs
- Soap.cs
- TemplateInstanceAttribute.cs
- BatchParser.cs
- StructuralCache.cs
- SpellerInterop.cs
- PasswordTextContainer.cs
- NamespaceQuery.cs
- AppDomainShutdownMonitor.cs
- DataGridViewCellStyleChangedEventArgs.cs
- StyleBamlRecordReader.cs
- ExpressionConverter.cs
- ImportContext.cs
- KeyManager.cs
- TransformConverter.cs
- TemplateColumn.cs
- UserMapPath.cs
- WindowsTreeView.cs
- CssClassPropertyAttribute.cs
- PointLight.cs
- ReferentialConstraint.cs
- EndpointAddressAugust2004.cs
- PageCatalogPart.cs
- ItemCheckEvent.cs
- TouchPoint.cs
- ConcurrentDictionary.cs
- MethodMessage.cs
- RewritingSimplifier.cs
- ByteConverter.cs
- PassportPrincipal.cs
- BrushValueSerializer.cs
- RecordBuilder.cs
- GridPattern.cs
- PtsHelper.cs
- BamlVersionHeader.cs
- ScriptControl.cs
- ListView.cs
- CodeTypeReference.cs
- RadioButtonStandardAdapter.cs
- Model3DGroup.cs
- QilGeneratorEnv.cs
- XsltArgumentList.cs
- HandlerBase.cs
- ProcessThread.cs
- IntranetCredentialPolicy.cs
- SingleAnimationUsingKeyFrames.cs
- HtmlPageAdapter.cs
- CodeCommentStatementCollection.cs
- MonitoringDescriptionAttribute.cs
- AuthenticateEventArgs.cs
- TreeView.cs
- DesignerTextBoxAdapter.cs
- WebHttpElement.cs
- Base64Decoder.cs
- DesignerWebPartChrome.cs
- SecurityPolicyVersion.cs
- WasAdminWrapper.cs
- GeneralTransform2DTo3D.cs
- DataGridViewColumnStateChangedEventArgs.cs
- DataGridViewLinkColumn.cs
- EntityUtil.cs
- ModelFunction.cs
- DataStreams.cs
- RangeValuePattern.cs
- RunInstallerAttribute.cs
- IdentityReference.cs
- SqlProfileProvider.cs
- Image.cs
- DesignerHost.cs
- ArrangedElementCollection.cs
- WindowsNonControl.cs
- HtmlTableRowCollection.cs
- XmlRawWriter.cs
- InvokeBinder.cs
- CalloutQueueItem.cs