Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Threading / Tasks / TPLETWProvider.cs / 1305376 / TPLETWProvider.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// TplEtwProvider.cs
//
// [....]
//
// A helper class for firing ETW events related to the Task Parallel Library APIs.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System;
using System.Collections.Generic;
using System.Text;
namespace System.Threading
{
#if !FEATURE_PAL // PAL doesn't support eventing
using System.Diagnostics.Eventing;
sealed internal class TplEtwProvider : EventProviderBase
{
//
// Defines the singleton instance for the TPL ETW provider
//
// The TPL Event provider GUID is {2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5}
//
public static TplEtwProvider Log = new TplEtwProvider();
private TplEtwProvider() : base(new Guid(0x2e5dba47, 0xa3d2, 0x4d16, 0x8e, 0xe0, 0x66, 0x71, 0xff, 0xdc, 0xd7, 0xb5)) { }
/////////////////////////////////////////////////////////////////////////////////////
//
// Parallel API Events
//
public enum ForkJoinOperationType
{
ParallelInvoke=1,
ParallelFor,
ParallelForEach
}
//
// The ParallelLoopStarted event denotes the entry point for a Parallel.For or Parallel.ForEach loop
//
[Event(1, Level = EventLevel.LogAlways)]
public void ParallelLoopBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, ForkJoinOperationType OperationType, // PFX_FORKJOIN_COMMON_EVENT_HEADER
long InclusiveFrom, long ExclusiveTo)
{
if (IsEnabled()) WriteEvent(1, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, (int) OperationType, InclusiveFrom, ExclusiveTo);
}
//
// The ParallelLoopEnd event denotes the end of a Parallel.For or Parallel.ForEach loop
//
[Event(2, Level = EventLevel.LogAlways)]
public void ParallelLoopEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, long TotalIterations)
{
if (IsEnabled()) WriteEvent(2, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, TotalIterations);
}
//
// The ParallelInvokeBegin event denotes the entry point for a Parallel.Invoke call
//
[Event(3, Level = EventLevel.LogAlways)]
public void ParallelInvokeBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, ForkJoinOperationType OperationType, // PFX_FORKJOIN_COMMON_EVENT_HEADER
int ActionCount)
{
if (IsEnabled()) WriteEvent(3, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, (int) OperationType, ActionCount);
}
//
// The ParallelInvokeEnd event denotes the exit point for a Parallel.Invoke call
//
[Event(4, Level = EventLevel.LogAlways)]
public void ParallelInvokeEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(4, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID);
}
//
// The ParallelFork event denotes the start of an individual task that's part of
// a fork/join context. Before this event is fired, the start of the new fork/join context
// will be marked with another event that declares a unique context ID.
//
[Event(5, Level = EventLevel.LogAlways)]
public void ParallelFork(int OriginatingTaskManager, int OriginatingTaskID, int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(5, OriginatingTaskManager, OriginatingTaskID, ForkJoinContextID);
}
//
// The ParallelJoin event denotes the end of an individual task that's part of
// a fork/join context. This should match a previous ParallelFork event with a matching "OriginatingTaskID"
//
[Event(6, Level = EventLevel.LogAlways)]
public void ParallelJoin(int OriginatingTaskSchedulerID, int OriginatingTaskID, int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(6, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID);
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Task Events
//
// These are all verbose events, so we need to call IsEnabled(EventLevel.Verbose, EventKeywords.None) call.
// However since the IsEnabled(l,k) call is more expensive than IsEnabled(),
// we only want to incur this cost when instrumentation is enabled.
// So the Task codepaths that call these event functions will still do the check for IsEnabled()
//
// The TaskScheduled event is fired when a task is queued to the TaskManager
//
[Event(7, Level = EventLevel.Verbose)]
public void TaskScheduled(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID, int CreatingTaskID, int TaskCreationOptions)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(7, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, CreatingTaskID, TaskCreationOptions);
}
//
// The TaskStarted event is fired just before a task actually starts executing
//
[Event(8, Level = EventLevel.Verbose)]
public void TaskStarted(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(8, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
//
// The TaskCompleted event is fired right after a task finished executing
//
[Event(9, Level = EventLevel.Verbose)]
public void TaskCompleted(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID, bool IsExceptional)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(9, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, IsExceptional);
}
//
// The TaskWaitBegin event is fired when starting to wait for a taks's completion explicitly or implicitly.
//
[Event(10, Level = EventLevel.Verbose)]
public void TaskWaitBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(10, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
//
// The TaskWaitEnd event is fired when the wait for a tasks completion returns
//
[Event(11, Level = EventLevel.Verbose)]
public void TaskWaitEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(11, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
}
#endif // !FEATURE_PAL
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// TplEtwProvider.cs
//
// [....]
//
// A helper class for firing ETW events related to the Task Parallel Library APIs.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System;
using System.Collections.Generic;
using System.Text;
namespace System.Threading
{
#if !FEATURE_PAL // PAL doesn't support eventing
using System.Diagnostics.Eventing;
sealed internal class TplEtwProvider : EventProviderBase
{
//
// Defines the singleton instance for the TPL ETW provider
//
// The TPL Event provider GUID is {2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5}
//
public static TplEtwProvider Log = new TplEtwProvider();
private TplEtwProvider() : base(new Guid(0x2e5dba47, 0xa3d2, 0x4d16, 0x8e, 0xe0, 0x66, 0x71, 0xff, 0xdc, 0xd7, 0xb5)) { }
/////////////////////////////////////////////////////////////////////////////////////
//
// Parallel API Events
//
public enum ForkJoinOperationType
{
ParallelInvoke=1,
ParallelFor,
ParallelForEach
}
//
// The ParallelLoopStarted event denotes the entry point for a Parallel.For or Parallel.ForEach loop
//
[Event(1, Level = EventLevel.LogAlways)]
public void ParallelLoopBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, ForkJoinOperationType OperationType, // PFX_FORKJOIN_COMMON_EVENT_HEADER
long InclusiveFrom, long ExclusiveTo)
{
if (IsEnabled()) WriteEvent(1, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, (int) OperationType, InclusiveFrom, ExclusiveTo);
}
//
// The ParallelLoopEnd event denotes the end of a Parallel.For or Parallel.ForEach loop
//
[Event(2, Level = EventLevel.LogAlways)]
public void ParallelLoopEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, long TotalIterations)
{
if (IsEnabled()) WriteEvent(2, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, TotalIterations);
}
//
// The ParallelInvokeBegin event denotes the entry point for a Parallel.Invoke call
//
[Event(3, Level = EventLevel.LogAlways)]
public void ParallelInvokeBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID, ForkJoinOperationType OperationType, // PFX_FORKJOIN_COMMON_EVENT_HEADER
int ActionCount)
{
if (IsEnabled()) WriteEvent(3, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID, (int) OperationType, ActionCount);
}
//
// The ParallelInvokeEnd event denotes the exit point for a Parallel.Invoke call
//
[Event(4, Level = EventLevel.LogAlways)]
public void ParallelInvokeEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(4, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID);
}
//
// The ParallelFork event denotes the start of an individual task that's part of
// a fork/join context. Before this event is fired, the start of the new fork/join context
// will be marked with another event that declares a unique context ID.
//
[Event(5, Level = EventLevel.LogAlways)]
public void ParallelFork(int OriginatingTaskManager, int OriginatingTaskID, int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(5, OriginatingTaskManager, OriginatingTaskID, ForkJoinContextID);
}
//
// The ParallelJoin event denotes the end of an individual task that's part of
// a fork/join context. This should match a previous ParallelFork event with a matching "OriginatingTaskID"
//
[Event(6, Level = EventLevel.LogAlways)]
public void ParallelJoin(int OriginatingTaskSchedulerID, int OriginatingTaskID, int ForkJoinContextID)
{
if (IsEnabled()) WriteEvent(6, OriginatingTaskSchedulerID, OriginatingTaskID, ForkJoinContextID);
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Task Events
//
// These are all verbose events, so we need to call IsEnabled(EventLevel.Verbose, EventKeywords.None) call.
// However since the IsEnabled(l,k) call is more expensive than IsEnabled(),
// we only want to incur this cost when instrumentation is enabled.
// So the Task codepaths that call these event functions will still do the check for IsEnabled()
//
// The TaskScheduled event is fired when a task is queued to the TaskManager
//
[Event(7, Level = EventLevel.Verbose)]
public void TaskScheduled(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID, int CreatingTaskID, int TaskCreationOptions)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(7, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, CreatingTaskID, TaskCreationOptions);
}
//
// The TaskStarted event is fired just before a task actually starts executing
//
[Event(8, Level = EventLevel.Verbose)]
public void TaskStarted(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(8, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
//
// The TaskCompleted event is fired right after a task finished executing
//
[Event(9, Level = EventLevel.Verbose)]
public void TaskCompleted(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID, bool IsExceptional)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(9, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID, IsExceptional);
}
//
// The TaskWaitBegin event is fired when starting to wait for a taks's completion explicitly or implicitly.
//
[Event(10, Level = EventLevel.Verbose)]
public void TaskWaitBegin(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(10, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
//
// The TaskWaitEnd event is fired when the wait for a tasks completion returns
//
[Event(11, Level = EventLevel.Verbose)]
public void TaskWaitEnd(int OriginatingTaskSchedulerID, int OriginatingTaskID, // PFX_COMMON_EVENT_HEADER
int TaskID)
{
if (IsEnabled(EventLevel.Verbose, ((EventKeywords)(-1)) ))
WriteEvent(11, OriginatingTaskSchedulerID, OriginatingTaskID, TaskID);
}
}
#endif // !FEATURE_PAL
}
// 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
- BitmapDownload.cs
- SettingsSection.cs
- ThreadStaticAttribute.cs
- TemplateControl.cs
- Tag.cs
- DispatcherHooks.cs
- CreateUserWizard.cs
- FileCodeGroup.cs
- ImageIndexConverter.cs
- OptimisticConcurrencyException.cs
- InvalidDataException.cs
- TransformGroup.cs
- DataSourceProvider.cs
- MenuRendererStandards.cs
- DoubleAnimationBase.cs
- TextTreeRootNode.cs
- GridViewCellAutomationPeer.cs
- BaseTemplateCodeDomTreeGenerator.cs
- XPathException.cs
- DeleteStoreRequest.cs
- TableLayoutRowStyleCollection.cs
- UxThemeWrapper.cs
- XamlDesignerSerializationManager.cs
- HttpListener.cs
- ConfigurationValidatorAttribute.cs
- OdbcConnectionOpen.cs
- LinqDataSourceStatusEventArgs.cs
- ExtensionWindow.cs
- OdbcCommandBuilder.cs
- FontStretch.cs
- CurrentChangingEventArgs.cs
- IgnoreSectionHandler.cs
- HttpInputStream.cs
- SwitchElementsCollection.cs
- WindowsFormsSectionHandler.cs
- ConnectionProviderAttribute.cs
- CompiledQuery.cs
- ProfileEventArgs.cs
- DataGridViewRowCancelEventArgs.cs
- DbProviderSpecificTypePropertyAttribute.cs
- LinqDataSourceHelper.cs
- IPipelineRuntime.cs
- Opcode.cs
- InputMethodStateTypeInfo.cs
- basevalidator.cs
- documentsequencetextpointer.cs
- DetailsViewInsertedEventArgs.cs
- TrackBarDesigner.cs
- TransformPatternIdentifiers.cs
- VerticalConnector.xaml.cs
- AttributeQuery.cs
- FusionWrap.cs
- ConditionCollection.cs
- DataGridViewAutoSizeModeEventArgs.cs
- XmlEntityReference.cs
- StickyNoteContentControl.cs
- PathParser.cs
- QilCloneVisitor.cs
- NetworkStream.cs
- Annotation.cs
- ManagementPath.cs
- XmlBinaryReader.cs
- ToolstripProfessionalRenderer.cs
- MouseGestureValueSerializer.cs
- MatrixTransform3D.cs
- HttpStreamMessageEncoderFactory.cs
- GridViewItemAutomationPeer.cs
- CompilationRelaxations.cs
- UnmanagedMemoryStreamWrapper.cs
- ChildDocumentBlock.cs
- SafeEventHandle.cs
- OleDbStruct.cs
- SizeFConverter.cs
- LineServicesRun.cs
- KernelTypeValidation.cs
- RegionData.cs
- ToolTipAutomationPeer.cs
- EnumBuilder.cs
- OutOfProcStateClientManager.cs
- TargetPerspective.cs
- cookiecontainer.cs
- XmlText.cs
- GradientBrush.cs
- Literal.cs
- DeclaredTypeElementCollection.cs
- ObjectListTitleAttribute.cs
- Brushes.cs
- Soap.cs
- ListViewHitTestInfo.cs
- CodeNamespaceCollection.cs
- _TransmitFileOverlappedAsyncResult.cs
- COM2EnumConverter.cs
- InstanceStoreQueryResult.cs
- OAVariantLib.cs
- WebPartDescription.cs
- DataGridViewButtonColumn.cs
- OptimizedTemplateContent.cs
- TableCellCollection.cs
- ClientTargetCollection.cs
- XmlElement.cs