2022-07-11 13:33:51 +08:00

263 lines
7.0 KiB
C++

#pragma once
#include "il2cpp-class-internals.h"
namespace il2cpp
{
namespace icalls
{
namespace System
{
namespace System
{
namespace Diagnostics
{
struct CategoryDesc
{
const char *name;
const char *help;
unsigned char id;
signed int type : 2;
unsigned int instance_type : 6;
short first_counter;
};
#define PERFCTR_CAT(id, name, help, type, inst, first_counter) CATEGORY_ ## id,
#define PERFCTR_COUNTER(id, name, help, type, field)
enum
{
#include "perfcounters-def.h"
NUM_CATEGORIES
};
#undef PERFCTR_CAT
#undef PERFCTR_COUNTER
#define PERFCTR_CAT(id, name, help, type, inst, first_counter) CATEGORY_START_ ## id = -1,
#define PERFCTR_COUNTER(id, name, help, type, field) COUNTER_ ## id,
/* each counter is assigned an id starting from 0 inside the category */
enum
{
#include "perfcounters-def.h"
END_COUNTERS
};
#undef PERFCTR_CAT
#undef PERFCTR_COUNTER
#define PERFCTR_CAT(id, name, help, type, inst, first_counter)
#define PERFCTR_COUNTER(id, name, help, type, field) CCOUNTER_ ## id,
/* this is used just to count the number of counters */
enum
{
#include "perfcounters-def.h"
NUM_COUNTERS
};
struct CounterDesc
{
const char *name;
const char *help;
short id;
unsigned short offset; // offset inside Il2CppPerfCounters
int type;
};
enum
{
FTYPE_CATEGORY = 'C',
FTYPE_DELETED = 'D',
FTYPE_PREDEF_INSTANCE = 'P', // an instance of a predef counter
FTYPE_INSTANCE = 'I',
FTYPE_DIRTY = 'd',
FTYPE_END = 0
};
struct SharedHeader
{
unsigned char ftype;
unsigned char extra;
unsigned short size;
};
struct SharedCategory
{
SharedHeader header;
unsigned short num_counters;
unsigned short counters_data_size;
int num_instances;
/* variable length data follows */
char name[1];
// string name
// string help
// SharedCounter counters_info [num_counters]
};
struct SharedInstance
{
SharedHeader header;
size_t category_offset;
/* variable length data follows */
char instance_name[1];
// string name
};
struct SharedCounter
{
unsigned char type;
uint8_t seq_num;
/* variable length data follows */
char name[1];
// string name
// string help
};
struct CatSearch
{
Il2CppString *name;
SharedCategory *cat;
};
/* map of PerformanceCounterType.cs */
enum
{
NumberOfItemsHEX32 = 0x00000000,
NumberOfItemsHEX64 = 0x00000100,
NumberOfItems32 = 0x00010000,
NumberOfItems64 = 0x00010100,
CounterDelta32 = 0x00400400,
CounterDelta64 = 0x00400500,
SampleCounter = 0x00410400,
CountPerTimeInterval32 = 0x00450400,
CountPerTimeInterval64 = 0x00450500,
RateOfCountsPerSecond32 = 0x10410400,
RateOfCountsPerSecond64 = 0x10410500,
RawFraction = 0x20020400,
CounterTimer = 0x20410500,
Timer100Ns = 0x20510500,
SampleFraction = 0x20C20400,
CounterTimerInverse = 0x21410500,
Timer100NsInverse = 0x21510500,
CounterMultiTimer = 0x22410500,
CounterMultiTimer100Ns = 0x22510500,
CounterMultiTimerInverse = 0x23410500,
CounterMultiTimer100NsInverse = 0x23510500,
AverageTimer32 = 0x30020400,
ElapsedTime = 0x30240500,
AverageCount64 = 0x40020500,
SampleBase = 0x40030401,
AverageBase = 0x40030402,
RawBase = 0x40030403,
CounterMultiBase = 0x42030500
};
/* maps a small integer type to the counter types above */
static const int simple_type_to_type[] =
{
NumberOfItemsHEX32, NumberOfItemsHEX64,
NumberOfItems32, NumberOfItems64,
CounterDelta32, CounterDelta64,
SampleCounter, CountPerTimeInterval32,
CountPerTimeInterval64, RateOfCountsPerSecond32,
RateOfCountsPerSecond64, RawFraction,
CounterTimer, Timer100Ns,
SampleFraction, CounterTimerInverse,
Timer100NsInverse, CounterMultiTimer,
CounterMultiTimer100Ns, CounterMultiTimerInverse,
CounterMultiTimer100NsInverse, AverageTimer32,
ElapsedTime, AverageCount64,
SampleBase, AverageBase,
RawBase, CounterMultiBase
};
enum
{
SingleInstance,
MultiInstance,
CatTypeUnknown = -1
};
enum
{
ProcessInstance,
ThreadInstance,
CPUInstance,
MonoInstance,
NetworkInterfaceInstance,
CustomInstance
};
/* map of CounterSample.cs */
struct Il2CppCounterSample
{
int64_t rawValue;
int64_t baseValue;
int64_t counterFrequency;
int64_t systemFrequency;
int64_t timeStamp;
int64_t timeStamp100nSec;
int64_t counterTimeStamp;
int counterType;
};
#undef PERFCTR_CAT
#undef PERFCTR_COUNTER
#define PERFCTR_CAT(id, name, help, type, inst, first_counter) {name, help, CATEGORY_ ## id, type, inst ## Instance, CCOUNTER_ ## first_counter},
#define PERFCTR_COUNTER(id, name, help, type, field)
static const CategoryDesc
predef_categories[] =
{
/* sample runtime counter */
#include "perfcounters-def.h"
{ NULL, NULL, NUM_CATEGORIES, -1, 0, NUM_COUNTERS }
};
#undef PERFCTR_CAT
#undef PERFCTR_COUNTER
#define PERFCTR_CAT(id, name, help, type, inst, first_counter)
#define PERFCTR_COUNTER(id, name, help, type, field) {name, help, COUNTER_ ## id, offsetof (Il2CppPerfCounters, field), type},
static const CounterDesc
predef_counters[] =
{
#include "perfcounters-def.h"
{ NULL, NULL, -1, 0, 0 }
};
/*
* We have several different classes of counters:
* *) system counters
* *) runtime counters
* *) remote counters
* *) user-defined counters
* *) windows counters (the implementation on windows will use this)
*
* To easily handle the differences we create a vtable for each class that contains the
* function pointers with the actual implementation to access the counters.
*/
typedef struct _ImplVtable ImplVtable;
typedef bool(*SampleFunc) (ImplVtable *vtable, bool only_value, Il2CppCounterSample* sample);
typedef uint64_t(*UpdateFunc) (ImplVtable *vtable, bool do_incr, int64_t value);
typedef void(*CleanupFunc) (ImplVtable *vtable);
struct _ImplVtable
{
void *arg;
SampleFunc sample;
UpdateFunc update;
CleanupFunc cleanup;
};
struct CustomVTable
{
ImplVtable vtable;
SharedInstance *instance_desc;
SharedCounter *counter_desc;
};
const CategoryDesc* find_category(Il2CppString *category);
const CounterDesc* get_counter_in_category(const CategoryDesc *desc, Il2CppString *counter);
ImplVtable* create_vtable(void *arg, SampleFunc sample, UpdateFunc update);
} /* namespace Diagnostics */
} /* namespace System */
} /* namespace System */
} /* namespace icalls */
} /* namespace il2cpp */