diff options
author | serxa <serxa@yandex-team.ru> | 2022-02-10 16:49:08 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:49:08 +0300 |
commit | e5d4696304c6689379ac7ce334512404d4b7836c (patch) | |
tree | 5d5cb817648f650d76cf1076100726fd9b8448e8 /library/cpp/lwtrace/preprocessor.h | |
parent | d6d7db348c2cc64e71243cab9940ee6778f4317d (diff) | |
download | ydb-e5d4696304c6689379ac7ce334512404d4b7836c.tar.gz |
Restoring authorship annotation for <serxa@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/lwtrace/preprocessor.h')
-rw-r--r-- | library/cpp/lwtrace/preprocessor.h | 524 |
1 files changed, 262 insertions, 262 deletions
diff --git a/library/cpp/lwtrace/preprocessor.h b/library/cpp/lwtrace/preprocessor.h index abc21870d6..40865467b2 100644 --- a/library/cpp/lwtrace/preprocessor.h +++ b/library/cpp/lwtrace/preprocessor.h @@ -1,8 +1,8 @@ -#pragma once - -#include "check.h" -#include "perf.h" -#include "symbol.h" +#pragma once + +#include "check.h" +#include "perf.h" +#include "symbol.h" #include <util/generic/hide_ptr.h> #include <util/system/platform.h> @@ -15,281 +15,281 @@ #endif // LWTRACE_DISABLE #endif // _win_ -// Maximum number of executors that can be attached to a probe -#define LWTRACE_MAX_ACTIONS 100 - -// Maximum number of groups that can be assigned to a probe -#define LWTRACE_MAX_GROUPS 100 - -#ifndef LWTRACE_DISABLE - -/* - * WARNING: All macros define in this header must be considered as implementation details and should NOT be used directly - * WARNING: See lwtrace/all.h for macros that represent a user interface of lwtrace library - * - */ - -// Use for code generation to handle parameter types. USAGE: -// 1. #define FOREACH_PARAMTYPE_MACRO(n, t, v, your_p1, your_p2) your code snippet -// 2. FOREACH_PARAMTYPE(FOREACH_PARAMTYPE_MACRO, your_p1_value, your_p1_value) -// FOREACH_PARAMTYPE(FOREACH_PARAMTYPE_MACRO, your_p1_another_value, your_p1_another_value) -// 3. #undef FOREACH_PARAMTYPE_MACRO +// Maximum number of executors that can be attached to a probe +#define LWTRACE_MAX_ACTIONS 100 + +// Maximum number of groups that can be assigned to a probe +#define LWTRACE_MAX_GROUPS 100 + +#ifndef LWTRACE_DISABLE + +/* + * WARNING: All macros define in this header must be considered as implementation details and should NOT be used directly + * WARNING: See lwtrace/all.h for macros that represent a user interface of lwtrace library + * + */ + +// Use for code generation to handle parameter types. USAGE: +// 1. #define FOREACH_PARAMTYPE_MACRO(n, t, v, your_p1, your_p2) your code snippet +// 2. FOREACH_PARAMTYPE(FOREACH_PARAMTYPE_MACRO, your_p1_value, your_p1_value) +// FOREACH_PARAMTYPE(FOREACH_PARAMTYPE_MACRO, your_p1_another_value, your_p1_another_value) +// 3. #undef FOREACH_PARAMTYPE_MACRO // Type order matters! -#define FOREACH_PARAMTYPE(MACRO, ...) \ - MACRO("i64", i64, I64, ##__VA_ARGS__) \ - MACRO("ui64", ui64, Ui64, ##__VA_ARGS__) \ - MACRO("double", double, Double, ##__VA_ARGS__) \ - MACRO("string", TString, Str, ##__VA_ARGS__) \ - MACRO("symbol", NLWTrace::TSymbol, Symbol, ##__VA_ARGS__) \ - MACRO("check", NLWTrace::TCheck, Check, ##__VA_ARGS__) \ - /**/ - -// Used with FOREACH_PARAMTYPE to handle TNil parameter type also -#define FOR_NIL_PARAMTYPE(MACRO, ...) \ - MACRO(NULL, TNil, Nil, ##__VA_ARGS__) \ - /**/ - +#define FOREACH_PARAMTYPE(MACRO, ...) \ + MACRO("i64", i64, I64, ##__VA_ARGS__) \ + MACRO("ui64", ui64, Ui64, ##__VA_ARGS__) \ + MACRO("double", double, Double, ##__VA_ARGS__) \ + MACRO("string", TString, Str, ##__VA_ARGS__) \ + MACRO("symbol", NLWTrace::TSymbol, Symbol, ##__VA_ARGS__) \ + MACRO("check", NLWTrace::TCheck, Check, ##__VA_ARGS__) \ + /**/ + +// Used with FOREACH_PARAMTYPE to handle TNil parameter type also +#define FOR_NIL_PARAMTYPE(MACRO, ...) \ + MACRO(NULL, TNil, Nil, ##__VA_ARGS__) \ + /**/ + // Used for math statements -#define FOR_MATH_PARAMTYPE(MACRO, ...) \ - MACRO("i64", i64, I64, ##__VA_ARGS__) \ - MACRO("ui64", ui64, Ui64, ##__VA_ARGS__) \ - MACRO("check", NLWTrace::TCheck, Check, ##__VA_ARGS__) \ +#define FOR_MATH_PARAMTYPE(MACRO, ...) \ + MACRO("i64", i64, I64, ##__VA_ARGS__) \ + MACRO("ui64", ui64, Ui64, ##__VA_ARGS__) \ + MACRO("check", NLWTrace::TCheck, Check, ##__VA_ARGS__) \ /**/ -// Use for code generation to handle parameter lists +// Use for code generation to handle parameter lists // NOTE: this is the only place to change if more parameters needed -#define FOREACH_PARAMNUM(MACRO, ...) \ - MACRO(0, ##__VA_ARGS__) \ - MACRO(1, ##__VA_ARGS__) \ - MACRO(2, ##__VA_ARGS__) \ - MACRO(3, ##__VA_ARGS__) \ - MACRO(4, ##__VA_ARGS__) \ - MACRO(5, ##__VA_ARGS__) \ - MACRO(6, ##__VA_ARGS__) \ - MACRO(7, ##__VA_ARGS__) \ - MACRO(8, ##__VA_ARGS__) \ - MACRO(9, ##__VA_ARGS__) \ - MACRO(10, ##__VA_ARGS__) \ - MACRO(11, ##__VA_ARGS__) \ - MACRO(12, ##__VA_ARGS__) \ - MACRO(13, ##__VA_ARGS__) \ - MACRO(14, ##__VA_ARGS__) \ - MACRO(15, ##__VA_ARGS__) \ - MACRO(16, ##__VA_ARGS__) \ - /**/ - +#define FOREACH_PARAMNUM(MACRO, ...) \ + MACRO(0, ##__VA_ARGS__) \ + MACRO(1, ##__VA_ARGS__) \ + MACRO(2, ##__VA_ARGS__) \ + MACRO(3, ##__VA_ARGS__) \ + MACRO(4, ##__VA_ARGS__) \ + MACRO(5, ##__VA_ARGS__) \ + MACRO(6, ##__VA_ARGS__) \ + MACRO(7, ##__VA_ARGS__) \ + MACRO(8, ##__VA_ARGS__) \ + MACRO(9, ##__VA_ARGS__) \ + MACRO(10, ##__VA_ARGS__) \ + MACRO(11, ##__VA_ARGS__) \ + MACRO(12, ##__VA_ARGS__) \ + MACRO(13, ##__VA_ARGS__) \ + MACRO(14, ##__VA_ARGS__) \ + MACRO(15, ##__VA_ARGS__) \ + MACRO(16, ##__VA_ARGS__) \ + /**/ + #define FOREACH_LEFT_TYPE(MACRO, ...) \ - MACRO(__VA_ARGS__, OT_VARIABLE) \ - MACRO(__VA_ARGS__, OT_LITERAL) \ - MACRO(__VA_ARGS__, OT_PARAMETER) \ + MACRO(__VA_ARGS__, OT_VARIABLE) \ + MACRO(__VA_ARGS__, OT_LITERAL) \ + MACRO(__VA_ARGS__, OT_PARAMETER) \ /**/ #define FOREACH_RIGHT_TYPE(MACRO, ...) \ - MACRO(__VA_ARGS__, OT_VARIABLE) \ - MACRO(__VA_ARGS__, OT_LITERAL) \ - MACRO(__VA_ARGS__, OT_PARAMETER) \ + MACRO(__VA_ARGS__, OT_VARIABLE) \ + MACRO(__VA_ARGS__, OT_LITERAL) \ + MACRO(__VA_ARGS__, OT_PARAMETER) \ /**/ #define FOREACH_DESTINATION_TYPE(MACRO, ...) \ - MACRO(__VA_ARGS__, OT_VARIABLE) \ + MACRO(__VA_ARGS__, OT_VARIABLE) \ /**/ -// Auxilary macros -#define LWTRACE_EXPAND(x) x -#define LWTRACE_EAT(...) - -// Eat last/first comma trick -#define LWTRACE_COMMA(bit) LWTRACE_COMMA_##bit() -#define LWTRACE_COMMA_0() -#define LWTRACE_COMMA_1() , - -// Macros to pack/unpack tuples, e.g. (x,y,z) -#define LWTRACE_UNROLL(...) __VA_ARGS__ -#define LWTRACE_ENROLL(...) (__VA_ARGS__) - -// Param types list handling macros -#define LWTRACE_TEMPLATE_PARAMS_I(i) (1) class TP##i = TNil LWTRACE_COMMA -#define LWTRACE_TEMPLATE_PARAMS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_PARAMS_I)(0)) -#define LWTRACE_TEMPLATE_PARAMS_NODEF_I(i) (1) class TP##i LWTRACE_COMMA -#define LWTRACE_TEMPLATE_PARAMS_NODEF LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_PARAMS_NODEF_I)(0)) -#define LWTRACE_TEMPLATE_ARGS_I(i) (1) TP##i LWTRACE_COMMA -#define LWTRACE_TEMPLATE_ARGS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_ARGS_I)(0)) +// Auxilary macros +#define LWTRACE_EXPAND(x) x +#define LWTRACE_EAT(...) + +// Eat last/first comma trick +#define LWTRACE_COMMA(bit) LWTRACE_COMMA_##bit() +#define LWTRACE_COMMA_0() +#define LWTRACE_COMMA_1() , + +// Macros to pack/unpack tuples, e.g. (x,y,z) +#define LWTRACE_UNROLL(...) __VA_ARGS__ +#define LWTRACE_ENROLL(...) (__VA_ARGS__) + +// Param types list handling macros +#define LWTRACE_TEMPLATE_PARAMS_I(i) (1) class TP##i = TNil LWTRACE_COMMA +#define LWTRACE_TEMPLATE_PARAMS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_PARAMS_I)(0)) +#define LWTRACE_TEMPLATE_PARAMS_NODEF_I(i) (1) class TP##i LWTRACE_COMMA +#define LWTRACE_TEMPLATE_PARAMS_NODEF LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_PARAMS_NODEF_I)(0)) +#define LWTRACE_TEMPLATE_ARGS_I(i) (1) TP##i LWTRACE_COMMA +#define LWTRACE_TEMPLATE_ARGS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_TEMPLATE_ARGS_I)(0)) #define LWTRACE_FUNCTION_PARAMS_I(i) (1) typename ::NLWTrace::TParamTraits<TP##i>::TFuncParam p##i = ERROR_not_enough_parameters() LWTRACE_COMMA -#define LWTRACE_FUNCTION_PARAMS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_FUNCTION_PARAMS_I)(0)) +#define LWTRACE_FUNCTION_PARAMS LWTRACE_EXPAND(LWTRACE_EAT FOREACH_PARAMNUM(LWTRACE_FUNCTION_PARAMS_I)(0)) #define LWTRACE_PREPARE_PARAMS_I(i, params) params.Param[i].template CopyConstruct<typename ::NLWTrace::TParamTraits<TP##i>::TStoreType>(::NLWTrace::TParamTraits<TP##i>::ToStoreType(p##i)); -#define LWTRACE_PREPARE_PARAMS(params) \ - do { \ - FOREACH_PARAMNUM(LWTRACE_PREPARE_PARAMS_I, params) \ - } while (false) -#define LWTRACE_COUNT_PARAMS_I(i) +(std::is_same<TP##i, ::NLWTrace::TNil>::value ? 0 : 1) -#define LWTRACE_COUNT_PARAMS (0 FOREACH_PARAMNUM(LWTRACE_COUNT_PARAMS_I)) -#define LWTRACE_MAX_PARAMS_I(i) +1 -#define LWTRACE_MAX_PARAMS (0 FOREACH_PARAMNUM(LWTRACE_MAX_PARAMS_I)) - -// Determine maximum sizeof(t) over all supported types -#define LWTRACE_MAX_PARAM_SIZE_TA_TAIL_I(n, t, v) v, -#define LWTRACE_MAX_PARAM_SIZE_TA_TAIL \ - FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TA_TAIL_I) \ - 0 -#define LWTRACE_MAX_PARAM_SIZE_TP_I(n, t, v) , size_t v = 0 -#define LWTRACE_MAX_PARAM_SIZE_TP size_t Head = 0 FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TP_I) -#define LWTRACE_MAX_PARAM_SIZE_TA_I(n, t, v) , sizeof(t) -#define LWTRACE_MAX_PARAM_SIZE_TA 0 FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TA_I) -#define LWTRACE_MAX_PARAM_SIZE ::NLWTrace::TMaxParamSize<LWTRACE_MAX_PARAM_SIZE_TA>::Result - -namespace NLWTrace { - template <LWTRACE_MAX_PARAM_SIZE_TP> - struct TMaxParamSize { - static const size_t Tail = TMaxParamSize<LWTRACE_MAX_PARAM_SIZE_TA_TAIL>::Result; - static const size_t Result = (Head > Tail ? Head : Tail); - }; - - template <> - struct TMaxParamSize<> { - static const size_t Result = 0; - }; - -} - -// Define stuff that is needed to register probes before main() -#define LWTRACE_REGISTER_PROBES(provider) \ - namespace LWTRACE_GET_NAMESPACE(provider) { \ - struct TInitLWTrace##provider { \ - TInitLWTrace##provider() { \ - Singleton<NLWTrace::TProbeRegistry>()->AddProbesList(LWTRACE_GET_PROBES(provider)); \ - } \ - /* This may not be in anonymous namespace because otherwise */ \ - /* it is called twice when .so loaded twice */ \ - }* InitLWTrace##provider = Singleton<TInitLWTrace##provider>(); \ - } \ - /**/ - -// Macro for TSignature POD structure static initialization -#define LWTRACE_SIGNATURE_CTOR(types, names) \ - { \ - /* ParamTypes */ ::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::ParamTypes, \ - /* ParamNames */ {LWTRACE_EXPAND(LWTRACE_UNROLL names)}, \ - /* ParamCount */ ::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::ParamCount, \ - /* SerializeParams */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::SerializeParams, \ - /* CloneParams */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::CloneParams, \ +#define LWTRACE_PREPARE_PARAMS(params) \ + do { \ + FOREACH_PARAMNUM(LWTRACE_PREPARE_PARAMS_I, params) \ + } while (false) +#define LWTRACE_COUNT_PARAMS_I(i) +(std::is_same<TP##i, ::NLWTrace::TNil>::value ? 0 : 1) +#define LWTRACE_COUNT_PARAMS (0 FOREACH_PARAMNUM(LWTRACE_COUNT_PARAMS_I)) +#define LWTRACE_MAX_PARAMS_I(i) +1 +#define LWTRACE_MAX_PARAMS (0 FOREACH_PARAMNUM(LWTRACE_MAX_PARAMS_I)) + +// Determine maximum sizeof(t) over all supported types +#define LWTRACE_MAX_PARAM_SIZE_TA_TAIL_I(n, t, v) v, +#define LWTRACE_MAX_PARAM_SIZE_TA_TAIL \ + FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TA_TAIL_I) \ + 0 +#define LWTRACE_MAX_PARAM_SIZE_TP_I(n, t, v) , size_t v = 0 +#define LWTRACE_MAX_PARAM_SIZE_TP size_t Head = 0 FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TP_I) +#define LWTRACE_MAX_PARAM_SIZE_TA_I(n, t, v) , sizeof(t) +#define LWTRACE_MAX_PARAM_SIZE_TA 0 FOREACH_PARAMTYPE(LWTRACE_MAX_PARAM_SIZE_TA_I) +#define LWTRACE_MAX_PARAM_SIZE ::NLWTrace::TMaxParamSize<LWTRACE_MAX_PARAM_SIZE_TA>::Result + +namespace NLWTrace { + template <LWTRACE_MAX_PARAM_SIZE_TP> + struct TMaxParamSize { + static const size_t Tail = TMaxParamSize<LWTRACE_MAX_PARAM_SIZE_TA_TAIL>::Result; + static const size_t Result = (Head > Tail ? Head : Tail); + }; + + template <> + struct TMaxParamSize<> { + static const size_t Result = 0; + }; + +} + +// Define stuff that is needed to register probes before main() +#define LWTRACE_REGISTER_PROBES(provider) \ + namespace LWTRACE_GET_NAMESPACE(provider) { \ + struct TInitLWTrace##provider { \ + TInitLWTrace##provider() { \ + Singleton<NLWTrace::TProbeRegistry>()->AddProbesList(LWTRACE_GET_PROBES(provider)); \ + } \ + /* This may not be in anonymous namespace because otherwise */ \ + /* it is called twice when .so loaded twice */ \ + }* InitLWTrace##provider = Singleton<TInitLWTrace##provider>(); \ + } \ + /**/ + +// Macro for TSignature POD structure static initialization +#define LWTRACE_SIGNATURE_CTOR(types, names) \ + { \ + /* ParamTypes */ ::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::ParamTypes, \ + /* ParamNames */ {LWTRACE_EXPAND(LWTRACE_UNROLL names)}, \ + /* ParamCount */ ::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::ParamCount, \ + /* SerializeParams */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::SerializeParams, \ + /* CloneParams */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::CloneParams, \ /* DestroyParams */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::DestroyParams, \ /* SerializeToPb */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::SerializeToPb, \ /* DeserializeFromPb */ &::NLWTrace::TUserSignature<LWTRACE_EXPAND(LWTRACE_UNROLL types)>::DeserializeFromPb\ - } - -// Macro for TEvent POD structure static initialization -#define LWTRACE_EVENT_CTOR(name, groups, types, names) \ - { \ - /* Name */ #name, \ - /* Groups */ {LWTRACE_EXPAND(LWTRACE_UNROLL_GROUPS groups)}, \ - /* Signature */ LWTRACE_SIGNATURE_CTOR(types, names) \ - } - -// Macro for TProbe POD structure static initialization -#define LWTRACE_PROBE_CTOR(name, groups, types, names) \ - { \ - /* Event */ LWTRACE_EVENT_CTOR(name, groups, types, names), \ - /* ExecutorsCount */ 0, \ - /* Lock */ {0}, \ - /* Executors */ {0}, \ - /* Front */ 0, \ - /* Back */ 0 \ - } - -// Provider static data accessors -#define LWTRACE_GET_NAMESPACE(provider) NLWTrace_##provider -#define LWTRACE_GET_NAME(name) lwtrace_##name -#define LWTRACE_GET_TYPE(name) TLWTrace_##name -#define LWTRACE_GET_PROBES_I(provider) gProbes##provider -#define LWTRACE_GET_EVENTS_I(provider) gEvents##provider - -// Declaration of provider static data -#define LWTRACE_DECLARE_PROBE(name, groups, types, names) \ - typedef ::NLWTrace::TUserProbe<LWTRACE_EXPAND(LWTRACE_UNROLL types)> LWTRACE_GET_TYPE(name); \ - extern LWTRACE_GET_TYPE(name) LWTRACE_GET_NAME(name); \ - /**/ -#define LWTRACE_DECLARE_EVENT(name, groups, types, names) \ - typedef ::NLWTrace::TUserEvent<LWTRACE_EXPAND(LWTRACE_UNROLL types)> LWTRACE_GET_TYPE(name); \ - extern LWTRACE_GET_TYPE(name) LWTRACE_GET_NAME(name); \ - /**/ -#define LWTRACE_DECLARE_PROVIDER_I(provider) \ - namespace LWTRACE_GET_NAMESPACE(provider) { \ - provider(LWTRACE_DECLARE_PROBE, LWTRACE_DECLARE_EVENT, LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ - } \ - extern ::NLWTrace::TProbe* LWTRACE_GET_PROBES_I(provider)[]; \ - extern ::NLWTrace::TEvent* LWTRACE_GET_EVENTS_I(provider)[]; \ - /**/ - -// Initialization of provider static data -#define LWTRACE_UNROLL_GROUPS(x) #x, LWTRACE_UNROLL -#define LWTRACE_DEFINE_PROBE(name, groups, types, names) \ - LWTRACE_GET_TYPE(name) \ - LWTRACE_GET_NAME(name) = \ - {LWTRACE_PROBE_CTOR(name, groups, types, names)}; \ - /**/ -#define LWTRACE_DEFINE_EVENT(name, groups, types, names) \ - LWTRACE_GET_TYPE(name) \ - LWTRACE_GET_NAME(name) = \ - {LWTRACE_EVENT_CTOR(name, groups, types, names)}; \ - /**/ -#define LWTRACE_PROBE_ADDRESS_I(name, groups, types, names) \ - LWTRACE_GET_NAME(name).Probe, /**/ -#define LWTRACE_PROBE_ADDRESS(provider) \ - &LWTRACE_GET_NAMESPACE(provider)::LWTRACE_PROBE_ADDRESS_I /**/ -#define LWTRACE_EVENT_ADDRESS_I(name, groups, types, names) \ - LWTRACE_GET_NAME(name).Event, /**/ -#define LWTRACE_EVENT_ADDRESS(provider) \ - &LWTRACE_GET_NAMESPACE(provider)::LWTRACE_EVENT_ADDRESS_I /**/ -#define LWTRACE_DEFINE_PROVIDER_I(provider) \ - namespace LWTRACE_GET_NAMESPACE(provider) { \ - provider(LWTRACE_DEFINE_PROBE, LWTRACE_DEFINE_EVENT, (provider)LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ - } \ - ::NLWTrace::TProbe* LWTRACE_GET_PROBES_I(provider)[] = { \ - provider(LWTRACE_PROBE_ADDRESS(provider), LWTRACE_EAT, LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ - NULL}; \ - ::NLWTrace::TEvent* LWTRACE_GET_EVENTS_I(provider)[] = { \ - provider(LWTRACE_EAT, LWTRACE_EVENT_ADDRESS(provider), LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ - NULL}; \ - LWTRACE_REGISTER_PROBES(provider) - /**/ - -#define LWPROBE_I(probe, ...) \ - do { \ - if ((probe).Probe.GetExecutorsCount() > 0) { \ - ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ - TReadSpinLockGuard g((probe).Probe.Lock); \ - if ((probe).Probe.GetExecutorsCount() > 0) { \ - (probe)(__VA_ARGS__); \ - } \ - } \ - } while (false) /**/ - + } + +// Macro for TEvent POD structure static initialization +#define LWTRACE_EVENT_CTOR(name, groups, types, names) \ + { \ + /* Name */ #name, \ + /* Groups */ {LWTRACE_EXPAND(LWTRACE_UNROLL_GROUPS groups)}, \ + /* Signature */ LWTRACE_SIGNATURE_CTOR(types, names) \ + } + +// Macro for TProbe POD structure static initialization +#define LWTRACE_PROBE_CTOR(name, groups, types, names) \ + { \ + /* Event */ LWTRACE_EVENT_CTOR(name, groups, types, names), \ + /* ExecutorsCount */ 0, \ + /* Lock */ {0}, \ + /* Executors */ {0}, \ + /* Front */ 0, \ + /* Back */ 0 \ + } + +// Provider static data accessors +#define LWTRACE_GET_NAMESPACE(provider) NLWTrace_##provider +#define LWTRACE_GET_NAME(name) lwtrace_##name +#define LWTRACE_GET_TYPE(name) TLWTrace_##name +#define LWTRACE_GET_PROBES_I(provider) gProbes##provider +#define LWTRACE_GET_EVENTS_I(provider) gEvents##provider + +// Declaration of provider static data +#define LWTRACE_DECLARE_PROBE(name, groups, types, names) \ + typedef ::NLWTrace::TUserProbe<LWTRACE_EXPAND(LWTRACE_UNROLL types)> LWTRACE_GET_TYPE(name); \ + extern LWTRACE_GET_TYPE(name) LWTRACE_GET_NAME(name); \ + /**/ +#define LWTRACE_DECLARE_EVENT(name, groups, types, names) \ + typedef ::NLWTrace::TUserEvent<LWTRACE_EXPAND(LWTRACE_UNROLL types)> LWTRACE_GET_TYPE(name); \ + extern LWTRACE_GET_TYPE(name) LWTRACE_GET_NAME(name); \ + /**/ +#define LWTRACE_DECLARE_PROVIDER_I(provider) \ + namespace LWTRACE_GET_NAMESPACE(provider) { \ + provider(LWTRACE_DECLARE_PROBE, LWTRACE_DECLARE_EVENT, LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ + } \ + extern ::NLWTrace::TProbe* LWTRACE_GET_PROBES_I(provider)[]; \ + extern ::NLWTrace::TEvent* LWTRACE_GET_EVENTS_I(provider)[]; \ + /**/ + +// Initialization of provider static data +#define LWTRACE_UNROLL_GROUPS(x) #x, LWTRACE_UNROLL +#define LWTRACE_DEFINE_PROBE(name, groups, types, names) \ + LWTRACE_GET_TYPE(name) \ + LWTRACE_GET_NAME(name) = \ + {LWTRACE_PROBE_CTOR(name, groups, types, names)}; \ + /**/ +#define LWTRACE_DEFINE_EVENT(name, groups, types, names) \ + LWTRACE_GET_TYPE(name) \ + LWTRACE_GET_NAME(name) = \ + {LWTRACE_EVENT_CTOR(name, groups, types, names)}; \ + /**/ +#define LWTRACE_PROBE_ADDRESS_I(name, groups, types, names) \ + LWTRACE_GET_NAME(name).Probe, /**/ +#define LWTRACE_PROBE_ADDRESS(provider) \ + &LWTRACE_GET_NAMESPACE(provider)::LWTRACE_PROBE_ADDRESS_I /**/ +#define LWTRACE_EVENT_ADDRESS_I(name, groups, types, names) \ + LWTRACE_GET_NAME(name).Event, /**/ +#define LWTRACE_EVENT_ADDRESS(provider) \ + &LWTRACE_GET_NAMESPACE(provider)::LWTRACE_EVENT_ADDRESS_I /**/ +#define LWTRACE_DEFINE_PROVIDER_I(provider) \ + namespace LWTRACE_GET_NAMESPACE(provider) { \ + provider(LWTRACE_DEFINE_PROBE, LWTRACE_DEFINE_EVENT, (provider)LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ + } \ + ::NLWTrace::TProbe* LWTRACE_GET_PROBES_I(provider)[] = { \ + provider(LWTRACE_PROBE_ADDRESS(provider), LWTRACE_EAT, LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ + NULL}; \ + ::NLWTrace::TEvent* LWTRACE_GET_EVENTS_I(provider)[] = { \ + provider(LWTRACE_EAT, LWTRACE_EVENT_ADDRESS(provider), LWTRACE_ENROLL, LWTRACE_ENROLL, LWTRACE_ENROLL) \ + NULL}; \ + LWTRACE_REGISTER_PROBES(provider) + /**/ + +#define LWPROBE_I(probe, ...) \ + do { \ + if ((probe).Probe.GetExecutorsCount() > 0) { \ + ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ + TReadSpinLockGuard g((probe).Probe.Lock); \ + if ((probe).Probe.GetExecutorsCount() > 0) { \ + (probe)(__VA_ARGS__); \ + } \ + } \ + } while (false) /**/ + #define LWPROBE_ENABLED_I(probe) ((probe).Probe.GetExecutorsCount() > 0) -#define LWPROBE_DURATION_I(probetype, uniqid, probe, ...) probetype ::TScopedDuration uniqid(probe, 0 /* fake P0 - used for duration */, ##__VA_ARGS__); - -#define LWTRACK_I(probe, orbit, ...) \ - do { \ - if ((probe).Probe.GetExecutorsCount() > 0) { \ - ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ - TReadSpinLockGuard g((probe).Probe.Lock); \ - if ((probe).Probe.GetExecutorsCount() > 0) { \ - (probe).Run(orbit, ##__VA_ARGS__); \ - } \ - } else { \ - auto& _orbit = (orbit); \ - if (HasShuttles(_orbit)) { \ - ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ - (probe).RunShuttles(_orbit, ##__VA_ARGS__); \ - } \ - } \ - } while (false) /**/ - -#define LWEVENT_I(event, ...) (event)(__VA_ARGS__) - -#else -#define LWTRACE_MAX_PARAM_SIZE sizeof(void*) -#define LWTRACE_MAX_PARAMS 1 -#define FOREACH_PARAMTYPE(MACRO, ...) - -#endif +#define LWPROBE_DURATION_I(probetype, uniqid, probe, ...) probetype ::TScopedDuration uniqid(probe, 0 /* fake P0 - used for duration */, ##__VA_ARGS__); + +#define LWTRACK_I(probe, orbit, ...) \ + do { \ + if ((probe).Probe.GetExecutorsCount() > 0) { \ + ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ + TReadSpinLockGuard g((probe).Probe.Lock); \ + if ((probe).Probe.GetExecutorsCount() > 0) { \ + (probe).Run(orbit, ##__VA_ARGS__); \ + } \ + } else { \ + auto& _orbit = (orbit); \ + if (HasShuttles(_orbit)) { \ + ::NLWTrace::TScopedThreadCpuTracker _cpuTracker(probe); \ + (probe).RunShuttles(_orbit, ##__VA_ARGS__); \ + } \ + } \ + } while (false) /**/ + +#define LWEVENT_I(event, ...) (event)(__VA_ARGS__) + +#else +#define LWTRACE_MAX_PARAM_SIZE sizeof(void*) +#define LWTRACE_MAX_PARAMS 1 +#define FOREACH_PARAMTYPE(MACRO, ...) + +#endif |