Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / Management / AppDomainResourcePerfCounters.cs / 1305376 / AppDomainResourcePerfCounters.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Management { using System; using System.Configuration; using System.Web; using System.Threading; internal class AppDomainResourcePerfCounters { private const uint NUM_SECONDS_TO_POLL = 5; ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// internal static void Init() { if (_fInit) return; lock (_InitLock) { if (_fInit) return; if (AppDomain.MonitoringIsEnabled) { PerfCounters.SetCounter(AppPerfCounter.APP_CPU_USED_BASE, 100); _Timer = new Timer((new AppDomainResourcePerfCounters()).TimerCallback, null, NUM_SECONDS_TO_POLL * 1000, NUM_SECONDS_TO_POLL * 1000); } _fInit = true; } } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// internal static void Stop() { if (_Timer == null) return; // already stopped _StopRequested = true; lock (_InitLock) { if (_Timer != null) { ((IDisposable)_Timer).Dispose(); _Timer = null; } } // Wait for the _inProgressLock lock while (_inProgressLock != 0) { Thread.Sleep(100); } } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Static data private static bool _fInit = false; private static object _InitLock = new object(); private static Timer _Timer = null; private static int _inProgressLock = 0; private static bool _StopRequested = false; // Instance data private int _MemUsageLastReported = 0; private int _CPUUsageLastReported = 0; private TimeSpan _TotalCPUTime; private DateTime _LastCollectTime; ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// private AppDomainResourcePerfCounters() { _TotalCPUTime = AppDomain.CurrentDomain.MonitoringTotalProcessorTime; _LastCollectTime = DateTime.UtcNow; } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// private void TimerCallback(Object state) { if ( _StopRequested || // Stop has been called -- exit immediately !AppDomain.MonitoringIsEnabled || // Monitoring APIs will throw NotSupportedException if not-enabled Interlocked.Exchange(ref _inProgressLock, 1) != 0) // Is some thread currently executing the callback { return; } try { SetPerfCounters(); } catch { // don't bubble up exceptions, since we are on a timer thread } finally { Interlocked.Exchange(ref _inProgressLock, 0); } } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// private void SetPerfCounters() { //////////////////////////////////////////////////////////// // Calculate memory: Limited to 2TB (Int32.MaxValue * 1024 bytes) long memInKB = (AppDomain.CurrentDomain.MonitoringSurvivedMemorySize / 1024); // Mem used in KB _MemUsageLastReported = (int) Math.Min(Int32.MaxValue, Math.Max(0, memInKB)); // Make sure its within 0 and Int32.MaxValue PerfCounters.SetCounter(AppPerfCounter.APP_MEMORY_USED, _MemUsageLastReported); //////////////////////////////////////////////////////////// // Calculate CPU DateTime dtUtcNow = DateTime.UtcNow; TimeSpan newTotalCPUTime = AppDomain.CurrentDomain.MonitoringTotalProcessorTime; double timeElapsed = (dtUtcNow - _LastCollectTime).TotalMilliseconds; // Total time since last collect double cpuTimeUsed = (newTotalCPUTime - _TotalCPUTime).TotalMilliseconds; // Total CPU time used since last collect int cpuPercent = (int) ((cpuTimeUsed * 100) / timeElapsed); // Percent of CPU time used _CPUUsageLastReported = Math.Min(100, Math.Max(0, cpuPercent)); // Make sure it's within 0 and 100 PerfCounters.SetCounter(AppPerfCounter.APP_CPU_USED, _CPUUsageLastReported); // Update variables for next time _TotalCPUTime = newTotalCPUTime; _LastCollectTime = dtUtcNow; } } } // 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
- ComponentFactoryHelpers.cs
- FormsAuthenticationCredentials.cs
- DataGridViewImageCell.cs
- TextBoxView.cs
- Action.cs
- StrokeFIndices.cs
- NTAccount.cs
- XmlUtf8RawTextWriter.cs
- QueryCacheEntry.cs
- XmlCDATASection.cs
- NotEqual.cs
- CustomErrorsSectionWrapper.cs
- ActivityWithResult.cs
- Stackframe.cs
- FixedTextBuilder.cs
- DataGridViewEditingControlShowingEventArgs.cs
- CodeGroup.cs
- PackUriHelper.cs
- DirectoryRootQuery.cs
- TreeNodeEventArgs.cs
- AttachedAnnotationChangedEventArgs.cs
- DBCommandBuilder.cs
- VisualTarget.cs
- TextTabProperties.cs
- MarginsConverter.cs
- CodeTypeDelegate.cs
- TypeUnloadedException.cs
- WorkflowPersistenceService.cs
- Visual3D.cs
- WriterOutput.cs
- DataTableNewRowEvent.cs
- WorkflowInstanceExtensionCollection.cs
- DataPagerCommandEventArgs.cs
- TextRange.cs
- DataTableReader.cs
- ContentPresenter.cs
- CodeDomLocalizationProvider.cs
- HashSetEqualityComparer.cs
- XmlStringTable.cs
- DataGridViewColumn.cs
- SafeRegistryKey.cs
- CompilerError.cs
- CapabilitiesSection.cs
- DesignerDataView.cs
- RelationshipConverter.cs
- XmlLinkedNode.cs
- XmlAttributeOverrides.cs
- SQLUtility.cs
- ParentQuery.cs
- WebPartUtil.cs
- GridViewColumn.cs
- DataServiceSaveChangesEventArgs.cs
- UnsafeNativeMethodsPenimc.cs
- SqlNodeAnnotations.cs
- ACL.cs
- ViewValidator.cs
- MenuItem.cs
- ProgressiveCrcCalculatingStream.cs
- Model3DGroup.cs
- SharedPersonalizationStateInfo.cs
- CodeCommentStatementCollection.cs
- AddressingVersion.cs
- Block.cs
- initElementDictionary.cs
- LogFlushAsyncResult.cs
- SymbolEqualComparer.cs
- SpeakCompletedEventArgs.cs
- UserCancellationException.cs
- Normalization.cs
- TreeNodeEventArgs.cs
- MsmqIntegrationBindingCollectionElement.cs
- ExtensionQuery.cs
- Predicate.cs
- ControlEvent.cs
- SwitchAttribute.cs
- ReverseInheritProperty.cs
- RightNameExpirationInfoPair.cs
- SystemColors.cs
- ConfigXmlText.cs
- BStrWrapper.cs
- SourceItem.cs
- FusionWrap.cs
- QuotedPrintableStream.cs
- DoubleCollectionValueSerializer.cs
- AdapterUtil.cs
- DefaultParameterValueAttribute.cs
- BinaryKeyIdentifierClause.cs
- RecognitionEventArgs.cs
- XmlSchemaExternal.cs
- MaskedTextBox.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- LinqDataSourceSelectEventArgs.cs
- ViewRendering.cs
- ObjectDataSourceFilteringEventArgs.cs
- WSDualHttpBinding.cs
- TransactionContext.cs
- HtmlTableRowCollection.cs
- ConfigXmlCDataSection.cs
- ComboBox.cs
- RowsCopiedEventArgs.cs