/*
* Process Hacker .NET Tools -
* .NET Process IPC definitions
*
* Copyright (C) 2015-2016 dmex
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see .
*/
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the current folder for more information.
//-----------------------------------------------------------------------------
// PerfCounterDefs.h
//
// Internal Interface for CLR to use Performance counters.
//-----------------------------------------------------------------------------
//
// dmex: This header has been highly modified.
// Original: https://github.com/dotnet/coreclr/blob/master/src/inc/perfcounterdefs.h
#ifndef _PERF_COUNTERS_H_
#define _PERF_COUNTERS_H_
//-----------------------------------------------------------------------------
// Name of global IPC block
#define SHARED_PERF_IPC_NAME "SharedPerfIPCBlock"
//-----------------------------------------------------------------------------
// Attributes for the IPC block
#define PERF_ATTR_ON 0x0001 // Are we even updating any counters?
#define PERF_ATTR_GLOBAL 0x0002 // Is this a global or private block?
//.............................................................................
// Tri Counter. Support for the common trio of counters (Total, Current, and Instantaneous).
typedef struct _TRICOUNT
{
ULONG Current; // Current, has +, -
ULONG Total; // Total, has only +
} TRICOUNT;
//.............................................................................
// Interlocked Tri Counter. Support for the common trio of counters (Total, Current, and Instantaneous).
typedef struct _TRICOUNT_IL
{
ULONG Current; // Current, has +, -
ULONG Total; // Total, has only +
} TRICOUNT_IL;
//.............................................................................
// Dual Counter. Support for the (Total and Instantaneous (rate)). Helpful in cases
// where the current value is always same as the total value. ie. the counter is never
// decremented.
//.............................................................................
typedef struct _DUALCOUNT
{
ULONG Total;
} DUALCOUNT;
//-----------------------------------------------------------------------------
// Format for the Perf Counter IPC Block
// IPC block is broken up into sections. This marks it easier to marshall
// into different perfmon objects
//
//.............................................................................
// Naming convention (by prefix):
// c - Raw count of something.
// cb- count of bytes
// time - time value.
// depth - stack depth
//-----------------------------------------------------------------------------
#define MAX_TRACKED_GENS 3 // number of generations we track
#ifndef _WIN64
#include
#endif
typedef struct _Perf_GC
{
size_t cGenCollections[MAX_TRACKED_GENS]; // count of collects per gen
size_t cbPromotedMem[MAX_TRACKED_GENS - 1]; // count of promoted memory
size_t cbPromotedFinalizationMem; // count of memory promoted due to finalization
size_t cProcessID; // process ID
size_t cGenHeapSize[MAX_TRACKED_GENS]; // size of heaps per gen
size_t cTotalCommittedBytes; // total number of committed bytes.
size_t cTotalReservedBytes; // bytes reserved via VirtualAlloc
size_t cLrgObjSize; // size of Large Object Heap
size_t cSurviveFinalize; // count of instances surviving from finalizing
size_t cHandles; // count of GC handles
size_t cbAlloc; // bytes allocated
size_t cbLargeAlloc; // bytes allocated for Large Objects
size_t cInducedGCs; // number of explicit GCs
ULONG timeInGC; // Time in GC
ULONG timeInGCBase; // must follow time in GC counter
size_t cPinnedObj; // # of Pinned Objects
size_t cSinkBlocks; // # of sink blocks
} Perf_GC;
#ifndef _WIN64
#include
#endif
// Perf_GC_Wow64 mimics in a 64 bit process, the layout of Perf_GC in a 32 bit process
// It does this by replacing all size_t by ULONG
#include
typedef struct _Perf_GC_Wow64
{
ULONG cGenCollections[MAX_TRACKED_GENS]; // count of collects per gen
ULONG cbPromotedMem[MAX_TRACKED_GENS - 1]; // count of promoted memory
ULONG cbPromotedFinalizationMem; // count of memory promoted due to finalization
ULONG cProcessID; // process ID
ULONG cGenHeapSize[MAX_TRACKED_GENS]; // size of heaps per gen
ULONG cTotalCommittedBytes; // total number of committed bytes.
ULONG cTotalReservedBytes; // bytes reserved via VirtualAlloc
ULONG cLrgObjSize; // size of Large Object Heap
ULONG cSurviveFinalize; // count of instances surviving from finalizing
ULONG cHandles; // count of GC handles
ULONG cbAlloc; // bytes allocated
ULONG cbLargeAlloc; // bytes allocated for Large Objects
ULONG cInducedGCs; // number of explicit GCs
ULONG timeInGC; // Time in GC
ULONG timeInGCBase; // must follow time in GC counter
ULONG cPinnedObj; // # of Pinned Objects
ULONG cSinkBlocks; // # of sink blocks
} Perf_GC_Wow64;
#include
#ifndef _WIN64
#include
#endif
typedef struct Perf_Loading
{
TRICOUNT cClassesLoaded;
TRICOUNT_IL cAppDomains; // Current # of AppDomains
TRICOUNT cAssemblies; // Current # of Assemblies
UNALIGNED LONGLONG timeLoading; // % time loading
ULONG cAsmSearchLen; // Avg search length for assemblies
DUALCOUNT cLoadFailures; // Classes Failed to load
size_t cbLoaderHeapSize; // Total size of heap used by the loader
DUALCOUNT cAppDomainsUnloaded; // Rate at which app domains are unloaded
} Perf_Loading;
#ifndef _WIN64
#include
#endif
#include
typedef struct Perf_Loading_Wow64
{
TRICOUNT cClassesLoaded;
TRICOUNT_IL cAppDomains; // Current # of AppDomains
TRICOUNT cAssemblies; // Current # of Assemblies
UNALIGNED LONGLONG timeLoading; // % time loading
ULONG cAsmSearchLen; // Avg search length for assemblies
DUALCOUNT cLoadFailures; // Classes Failed to load
ULONG cbLoaderHeapSize; // Total size of heap used by the loader
DUALCOUNT cAppDomainsUnloaded; // Rate at which app domains are unloaded
} Perf_Loading_Wow64;
#include
#ifndef _WIN64
#include
#endif
typedef struct Perf_Jit
{
ULONG cMethodsJitted; // number of methods jitted
TRICOUNT cbILJitted; // IL jitted stats
//DUALCOUNT cbPitched; // Total bytes pitched
ULONG cJitFailures; // # of standard Jit failures
ULONG timeInJit; // Time in JIT since last sample
ULONG timeInJitBase; // Time in JIT base counter
} Perf_Jit;
#ifndef _WIN64
#include
#endif
#ifndef _WIN64
#include
#endif
typedef struct Perf_Excep
{
DUALCOUNT cThrown; // Number of Exceptions thrown
ULONG cFiltersExecuted; // Number of Filters executed
ULONG cFinallysExecuted; // Number of Finallys executed
ULONG cThrowToCatchStackDepth; // Delta from throw to catch site on stack
} Perf_Excep;
#ifndef _WIN64
#include
#endif
#ifndef _WIN64
#include
#endif
typedef struct Perf_Interop
{
ULONG cCCW; // Number of CCWs
ULONG cStubs; // Number of stubs
ULONG cMarshalling; // # of time marshalling args and return values.
ULONG cTLBImports; // Number of tlbs we import
ULONG cTLBExports; // Number of tlbs we export
} Perf_Interop;
#ifndef _WIN64
#include
#endif
#ifndef _WIN64
#include
#endif
typedef struct Perf_LocksAndThreads
{
// Locks
DUALCOUNT cContention; // # of times in AwareLock::EnterEpilogue()
TRICOUNT cQueueLength; // Lenght of queue
// Threads
ULONG cCurrentThreadsLogical; // Number (created - destroyed) of logical threads
ULONG cCurrentThreadsPhysical; // Number (created - destroyed) of OS threads
TRICOUNT cRecognizedThreads; // # of Threads execute in runtime's control
} Perf_LocksAndThreads;
#ifndef _WIN64
#include
#endif
// IMPORTANT!!!!!!!: The first two fields in the struct have to be together
// and be the first two fields in the struct. The managed code in ChannelServices.cs
// depends on this.
#ifndef _WIN64
#include
#endif
typedef struct Perf_Contexts
{
// Contexts & Remoting
DUALCOUNT cRemoteCalls; // # of remote calls
ULONG cChannels; // Number of current channels
ULONG cProxies; // Number of context proxies.
ULONG cClasses; // # of Context-bound classes
ULONG cObjAlloc; // # of context bound objects allocated
ULONG cContexts; // The current number of contexts.
} Perf_Contexts;
#ifndef _WIN64
#include
#endif
#ifndef _WIN64
#include
#endif
typedef struct Perf_Security
{
ULONG cTotalRTChecks; // Total runtime checks
UNALIGNED LONGLONG timeAuthorize; // % time authenticating
ULONG cLinkChecks; // link time checks
ULONG timeRTchecks; // % time in Runtime checks
ULONG timeRTchecksBase; // % time in Runtime checks base counter
ULONG stackWalkDepth; // depth of stack for security checks
} Perf_Security;
#ifndef _WIN64
#include
#endif
#include
typedef struct Perf_Security_Wow64
{
ULONG cTotalRTChecks; // Total runtime checks
UNALIGNED LONGLONG timeAuthorize; // % time authenticating
ULONG cLinkChecks; // link time checks
ULONG timeRTchecks; // % time in Runtime checks
ULONG timeRTchecksBase; // % time in Runtime checks base counter
ULONG stackWalkDepth; // depth of stack for security checks
} Perf_Security_Wow64;
#include
#ifndef _WIN64
#include
#endif
typedef struct _PerfCounterIPCControlBlock
{
// Versioning info
USHORT Bytes; // size of this entire block
USHORT Attributes; // attributes for this block
// Counter Sections
Perf_GC GC;
Perf_Contexts Context;
Perf_Interop Interop;
Perf_Loading Loading;
Perf_Excep Excep;
Perf_LocksAndThreads LocksAndThreads;
Perf_Jit Jit;
Perf_Security Security;
} PerfCounterIPCControlBlock;
#ifndef _WIN64
#include
#endif
#include
typedef struct _PerfCounterIPCControlBlock_Wow64
{
// Versioning info
USHORT Bytes; // size of this entire block
USHORT Attributes; // attributes for this block
// Counter Sections
Perf_GC_Wow64 GC;
Perf_Contexts Context;
Perf_Interop Interop;
Perf_Loading_Wow64 Loading;
Perf_Excep Excep;
Perf_LocksAndThreads LocksAndThreads;
Perf_Jit Jit;
Perf_Security_Wow64 Security;
} PerfCounterIPCControlBlock_Wow64;
#include
#endif _PERF_COUNTERS_H_