24 #include "node_etw_provider.h" 29 using v8::JitCodeEvent;
38 static uv_async_t dispatch_etw_events_change_async;
49 #define MAKE_V8TAG(s) { s, sizeof(s) - 1 } 73 #define V8_MARKER1 '*' 74 #define V8_MARKER2 '~' 80 for (
size_t i = 0; i < arraysize(trace_codes); i++) {
83 if (strncmp(name, trace_codes[i].
prefix, prelen) == 0) {
97 if (NODE_V8SYMBOL_ENABLED()) {
98 switch (jevent->type) {
99 case JitCodeEvent::CODE_ADDED:
101 if (pre_offset >= 0) {
103 NODE_V8SYMBOL_ADD(jevent->name.str + pre_offset,
104 jevent->name.len - pre_offset,
109 case JitCodeEvent::CODE_REMOVED:
110 NODE_V8SYMBOL_REMOVE(jevent->code_start, 0);
112 case JitCodeEvent::CODE_MOVED:
113 NODE_V8SYMBOL_MOVE(jevent->code_start, jevent->new_code_start);
128 if (events_enabled > 0) {
129 NODE_V8SYMBOL_RESET();
130 v8::Isolate::GetCurrent()->SetJitCodeEventHandler(
131 v8::kJitCodeEventEnumExisting,
134 v8::Isolate::GetCurrent()->SetJitCodeEventHandler(
135 v8::kJitCodeEventDefault,
149 ULONGLONG MatchAnyKeyword,
150 ULONGLONG MatchAllKeywords,
151 PEVENT_FILTER_DESCRIPTOR FilterData,
152 PVOID CallbackContext) {
155 if (events_enabled == 1) {
156 uv_async_send(&dispatch_etw_events_change_async);
160 if (events_enabled == 0) {
161 uv_async_send(&dispatch_etw_events_change_async);
170 advapi = LoadLibraryW(L
"advapi32.dll");
172 event_register = (EventRegisterFunc)
173 GetProcAddress(advapi,
"EventRegister");
174 event_unregister = (EventUnregisterFunc)
175 GetProcAddress(advapi,
"EventUnregister");
176 event_write = (EventWriteFunc)GetProcAddress(advapi,
"EventWrite");
179 CHECK_EQ(0, uv_async_init(uv_default_loop(),
180 &dispatch_etw_events_change_async,
182 uv_unref(reinterpret_cast<uv_handle_t*>(&dispatch_etw_events_change_async));
184 if (event_register) {
189 CHECK_EQ(status, ERROR_SUCCESS);
196 if (advapi && event_unregister && node_provider) {
202 v8::Isolate::GetCurrent()->SetJitCodeEventHandler(
203 v8::kJitCodeEventDefault,
EventUnregisterFunc event_unregister
EventWriteFunc event_write
void etw_events_change_async(uv_async_t *handle)
EventRegisterFunc event_register
int FilterCodeEvents(const char *name, size_t len)
void CodeAddressNotification(const JitCodeEvent *jevent)
void NTAPI etw_events_enable_callback(LPCGUID SourceId, ULONG IsEnabled, UCHAR Level, ULONGLONG MatchAnyKeyword, ULONGLONG MatchAllKeywords, PEVENT_FILTER_DESCRIPTOR FilterData, PVOID CallbackContext)
struct v8tags trace_codes[]