Skip to content

Commit 5480a5e

Browse files
committed
wip
1 parent 5778d23 commit 5480a5e

13 files changed

Lines changed: 209 additions & 31 deletions

File tree

src/coreclr/clr.featuredefines.props

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
<!-- single thread -->
2323
<FeaturePortableTimer Condition="'$(WasmEnableThreads)' != 'true'">false</FeaturePortableTimer>
2424
<FeaturePortableThreadPool Condition="'$(WasmEnableThreads)' != 'true'">false</FeaturePortableThreadPool>
25-
<!-- until we implement ST event pipe for CoreCLR -->
26-
<FeaturePerfTracing>false</FeaturePerfTracing>
2725
<ProfilingSupportedBuild>false</ProfilingSupportedBuild>
2826
</PropertyGroup>
2927

src/coreclr/clrfeatures.cmake

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@ if(CLR_CMAKE_TARGET_TIZEN_LINUX)
2424
endif()
2525

2626
if(NOT DEFINED FEATURE_EVENT_TRACE)
27-
if (NOT CLR_CMAKE_TARGET_BROWSER)
28-
# To actually disable FEATURE_EVENT_TRACE, also change clr.featuredefines.props
29-
set(FEATURE_EVENT_TRACE 1)
30-
endif()
27+
# To actually disable FEATURE_EVENT_TRACE, also change clr.featuredefines.props
28+
set(FEATURE_EVENT_TRACE 1)
3129
endif(NOT DEFINED FEATURE_EVENT_TRACE)
3230

3331
if(NOT DEFINED FEATURE_EVENTSOURCE_XPLAT)
@@ -37,9 +35,11 @@ if(NOT DEFINED FEATURE_EVENTSOURCE_XPLAT)
3735
endif()
3836
endif(NOT DEFINED FEATURE_EVENTSOURCE_XPLAT)
3937

40-
if(NOT DEFINED FEATURE_PERFTRACING AND FEATURE_EVENT_TRACE)
41-
set(FEATURE_PERFTRACING 1)
42-
endif(NOT DEFINED FEATURE_PERFTRACING AND FEATURE_EVENT_TRACE)
38+
if(NOT DEFINED FEATURE_PERFTRACING)
39+
if(FEATURE_EVENT_TRACE)
40+
set(FEATURE_PERFTRACING 1)
41+
endif()
42+
endif(NOT DEFINED FEATURE_PERFTRACING)
4343

4444
if(NOT DEFINED FEATURE_DBGIPC)
4545
if(CLR_CMAKE_TARGET_UNIX)

src/coreclr/inc/eventtracebase.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,20 @@ enum EtwGCSettingFlags
121121
#define ETWFireEvent(EventName) FireEtw##EventName(GetClrInstanceId())
122122

123123
#define ETW_TRACING_INITIALIZED(RegHandle) (TRUE)
124+
#if defined(HOST_BROWSER) || defined(HOST_WASI)
125+
#define ETW_EVENT_ENABLED(Context, EventDescriptor) (EventPipeHelper::IsEnabled(Context, EventDescriptor.Level, EventDescriptor.Keyword))
126+
#define ETW_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::IsEnabled(Context, Level, Keyword))
127+
#define ETW_TRACING_ENABLED(Context, EventDescriptor) (EventEnabled##EventDescriptor())
128+
#define ETW_TRACING_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::IsEnabled(Context, Level, Keyword))
129+
#else // HOST_BROWSER || HOST_WASI
124130
#define ETW_EVENT_ENABLED(Context, EventDescriptor) (EventPipeHelper::IsEnabled(Context, EventDescriptor.Level, EventDescriptor.Keyword) || \
125131
(XplatEventLogger::IsKeywordEnabled(Context, EventDescriptor.Level, EventDescriptor.Keyword)))
126132
#define ETW_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::IsEnabled(Context, Level, Keyword) || \
127133
(XplatEventLogger::IsKeywordEnabled(Context, Level, Keyword)))
128134
#define ETW_TRACING_ENABLED(Context, EventDescriptor) (EventEnabled##EventDescriptor())
129135
#define ETW_TRACING_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::IsEnabled(Context, Level, Keyword) || \
130136
(XplatEventLogger::IsKeywordEnabled(Context, Level, Keyword)))
137+
#endif // HOST_BROWSER || HOST_WASI
131138
#define ETW_PROVIDER_ENABLED(ProviderSymbol) (TRUE)
132139
#else //defined(FEATURE_PERFTRACING)
133140
#define ETW_INLINE
@@ -416,7 +423,7 @@ class XplatEventLoggerConfiguration
416423
};
417424
#endif // defined(FEATURE_PERFTRACING) || defined(FEATURE_EVENTSOURCE_XPLAT)
418425

419-
#if defined(HOST_UNIX) && (defined(FEATURE_EVENT_TRACE) || defined(FEATURE_EVENTSOURCE_XPLAT))
426+
#if defined(HOST_UNIX) && !defined(HOST_BROWSER) && !defined(HOST_WASI) && (defined(FEATURE_EVENT_TRACE) || defined(FEATURE_EVENTSOURCE_XPLAT))
420427

421428
class XplatEventLoggerController
422429
{
@@ -557,7 +564,7 @@ class XplatEventLogger
557564
};
558565

559566

560-
#endif // defined(HOST_UNIX) && (defined(FEATURE_EVENT_TRACE) || defined(FEATURE_EVENTSOURCE_XPLAT))
567+
#endif // defined(HOST_UNIX) && !defined(HOST_BROWSER) && !defined(HOST_WASI) && (defined(FEATURE_EVENT_TRACE) || defined(FEATURE_EVENTSOURCE_XPLAT))
561568

562569
#if defined(FEATURE_EVENT_TRACE)
563570

src/coreclr/scripts/genEventing.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,15 @@ def generateClrallEvents(eventNodes, allTemplates, target_cpp, runtimeFlavor, is
439439

440440
if runtimeFlavor.coreclr or write_xplatheader or runtimeFlavor.nativeaot:
441441
if not is_host_windows:
442-
# native AOT does not support non-windows eventing other than via event pipe
442+
# native AOT and browser/wasi do not support non-windows eventing other than via event pipe
443443
if not runtimeFlavor.nativeaot:
444-
clrallEvents.append(" || (XplatEventLogger" +
444+
clrallEvents.append("\n#if !defined(HOST_BROWSER) && !defined(HOST_WASI)\n")
445+
clrallEvents.append(" || (XplatEventLogger" +
445446
("::" if target_cpp else "_") +
446447
"IsEventLoggingEnabled() && EventXplatEnabled" +
447-
eventName + "());}\n\n")
448+
eventName + "())\n")
449+
clrallEvents.append("#endif // !HOST_BROWSER && !HOST_WASI\n")
450+
clrallEvents.append(";}\n\n")
448451
else:
449452
clrallEvents.append(";}\n\n")
450453
else:
@@ -865,11 +868,18 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
865868
dotnet_trace_context_typedef_unix = """
866869
#if !defined(DOTNET_TRACE_CONTEXT_DEF)
867870
#define DOTNET_TRACE_CONTEXT_DEF
871+
#if defined(HOST_BROWSER) || defined(HOST_WASI)
872+
typedef struct _DOTNET_TRACE_CONTEXT
873+
{
874+
EVENTPIPE_TRACE_CONTEXT EventPipeProvider;
875+
} DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT;
876+
#else
868877
typedef struct _DOTNET_TRACE_CONTEXT
869878
{
870879
EVENTPIPE_TRACE_CONTEXT EventPipeProvider;
871880
PLTTNG_TRACE_CONTEXT LttngProvider;
872881
} DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT;
882+
#endif
873883
#endif // DOTNET_TRACE_CONTEXT_DEF
874884
"""
875885

@@ -894,7 +904,9 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
894904
""")
895905
if not is_host_windows and not runtimeFlavor.nativeaot:
896906
Clrproviders.write(eventpipe_trace_context_typedef) # define EVENTPIPE_TRACE_CONTEXT
907+
Clrproviders.write("#if !defined(HOST_BROWSER) && !defined(HOST_WASI)\n")
897908
Clrproviders.write(lttng_trace_context_typedef) # define LTTNG_TRACE_CONTEXT
909+
Clrproviders.write("#endif // !HOST_BROWSER && !HOST_WASI\n")
898910
Clrproviders.write(dotnet_trace_context_typedef_unix + "\n")
899911

900912
allProviders = []
@@ -910,7 +922,9 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
910922
eventpipeProviderCtxName = providerSymbol + "_EVENTPIPE_Context"
911923
Clrproviders.write('__attribute__((weak)) EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
912924
lttngProviderCtxName = providerSymbol + "_LTTNG_Context"
925+
Clrproviders.write('#if !defined(HOST_BROWSER) && !defined(HOST_WASI)\n')
913926
Clrproviders.write('__attribute__((weak)) LTTNG_TRACE_CONTEXT ' + lttngProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
927+
Clrproviders.write('#endif // !HOST_BROWSER && !HOST_WASI\n')
914928

915929
Clrproviders.write("// Keywords\n");
916930
for keywordNode in providerNode.getElementsByTagName('keyword'):
@@ -934,10 +948,12 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern
934948

935949
# define and initialize runtime providers' DOTNET_TRACE_CONTEXT depending on the platform
936950
if not is_host_windows and not runtimeFlavor.nativeaot:
951+
Clrproviders.write('#if !defined(HOST_BROWSER) && !defined(HOST_WASI)\n')
937952
Clrproviders.write('#define NB_PROVIDERS ' + str(nbProviders) + '\n')
938953
Clrproviders.write(('constexpr ' if target_cpp else 'static const ') + 'LTTNG_TRACE_CONTEXT * ALL_LTTNG_PROVIDERS_CONTEXT[NB_PROVIDERS] = { ')
939954
Clrproviders.write(', '.join(allProviders))
940955
Clrproviders.write(' };\n')
956+
Clrproviders.write('#endif // !HOST_BROWSER && !HOST_WASI\n')
941957

942958

943959
clreventpipewriteevents = os.path.join(incDir, "clreventpipewriteevents.h")

src/coreclr/vm/eventing/CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ add_custom_command(
4040
set_source_files_properties(${EventingHeaders} PROPERTIES GENERATED TRUE)
4141

4242
add_custom_target(eventing_headers DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/eventing_headers.timestamp)
43-
add_dependencies(eventing_headers eventprovider)
44-
45-
add_subdirectory(eventpipe)
4643

4744
if(CLR_CMAKE_HOST_WIN32)
4845
add_subdirectory(EtwProvider)
4946
endif()
47+
48+
if (TARGET eventprovider)
49+
add_dependencies(eventing_headers eventprovider)
50+
endif()
51+
52+
add_subdirectory(eventpipe)

src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

Lines changed: 122 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,9 @@ ep_rt_provider_config_init (EventPipeProviderConfiguration *provider_config)
444444
// This function is auto-generated from /src/scripts/genEventPipe.py
445445
#ifdef TARGET_UNIX
446446
extern "C" void InitProvidersAndEvents ();
447-
#else
447+
#else // TARGET_UNIX
448448
extern void InitProvidersAndEvents ();
449-
#endif
449+
#endif // TARGET_UNIX
450450

451451
static
452452
void
@@ -659,6 +659,8 @@ ep_rt_byte_array_free (uint8_t *ptr)
659659
* Event.
660660
*/
661661

662+
#ifndef PERFTRACING_DISABLE_THREADS
663+
662664
static
663665
void
664666
ep_rt_wait_event_alloc (
@@ -757,6 +759,71 @@ ep_rt_wait_event_is_valid (ep_rt_wait_event_handle_t *wait_event)
757759
return wait_event->event->IsValid ();
758760
}
759761

762+
#else // PERFTRACING_DISABLE_THREADS
763+
764+
static
765+
inline
766+
void
767+
ep_rt_wait_event_alloc (
768+
ep_rt_wait_event_handle_t *wait_event,
769+
bool manual,
770+
bool initial)
771+
{
772+
EP_ASSERT (wait_event != NULL);
773+
wait_event->event = (CLREventStatic * )INVALID_HANDLE_VALUE;
774+
}
775+
776+
static
777+
inline
778+
void
779+
ep_rt_wait_event_free (ep_rt_wait_event_handle_t *wait_event)
780+
{
781+
wait_event->event = NULL;
782+
}
783+
784+
static
785+
inline
786+
bool
787+
ep_rt_wait_event_set (ep_rt_wait_event_handle_t *wait_event)
788+
{
789+
return true;
790+
}
791+
792+
static
793+
inline
794+
int32_t
795+
ep_rt_wait_event_wait (
796+
ep_rt_wait_event_handle_t *wait_event,
797+
uint32_t timeout,
798+
bool alertable)
799+
{
800+
EP_ASSERT (wait_event != NULL && wait_event->event == (CLREventStatic *)INVALID_HANDLE_VALUE);
801+
return (int32_t)0;
802+
}
803+
804+
static
805+
inline
806+
EventPipeWaitHandle
807+
ep_rt_wait_event_get_wait_handle (ep_rt_wait_event_handle_t *wait_event)
808+
{
809+
EP_ASSERT (wait_event != NULL);
810+
return (EventPipeWaitHandle)wait_event->event;
811+
}
812+
813+
static
814+
inline
815+
bool
816+
ep_rt_wait_event_is_valid (ep_rt_wait_event_handle_t *wait_event)
817+
{
818+
if (wait_event == NULL || wait_event->event == NULL || wait_event->event != (CLREventStatic *)INVALID_HANDLE_VALUE)
819+
return false;
820+
else
821+
return true;
822+
}
823+
824+
#endif // PERFTRACING_DISABLE_THREADS
825+
826+
760827
/*
761828
* Misc.
762829
*/
@@ -843,6 +910,7 @@ typedef struct _rt_coreclr_thread_params_internal_t {
843910
#undef EP_RT_DEFINE_THREAD_FUNC
844911
#define EP_RT_DEFINE_THREAD_FUNC(name) static ep_rt_thread_start_func_return_t WINAPI name (LPVOID data)
845912

913+
#ifndef PERFTRACING_DISABLE_THREADS
846914
EP_RT_DEFINE_THREAD_FUNC (ep_rt_thread_coreclr_start_func)
847915
{
848916
STATIC_CONTRACT_NOTHROW;
@@ -926,9 +994,58 @@ ep_rt_queue_job (
926994
void *job_func,
927995
void *params)
928996
{
929-
EP_UNREACHABLE ("Not implemented in CoreCLR");
997+
EP_UNREACHABLE ("Not implemented on in multi threaded");
998+
return false;
930999
}
9311000

1001+
#else // PERFTRACING_DISABLE_THREADS
1002+
1003+
static
1004+
inline
1005+
bool
1006+
ep_rt_thread_create (
1007+
void *thread_func,
1008+
void *params,
1009+
EventPipeThreadType thread_type,
1010+
void *id)
1011+
{
1012+
EP_UNREACHABLE ("Not implemented on in single threaded");
1013+
return false;
1014+
}
1015+
1016+
#ifdef HOST_BROWSER
1017+
typedef size_t (*ep_rt_job_cb_t)(void *data);
1018+
extern "C" void SystemJS_DiagnosticServerQueueJob (ep_rt_job_cb_t cb, void *data);
1019+
#endif
1020+
1021+
static
1022+
bool
1023+
ep_rt_queue_job (
1024+
void *job_func,
1025+
void *params)
1026+
{
1027+
#ifdef HOST_BROWSER
1028+
// in single-threaded, it will run the callback inline and re-schedule itself if necessary
1029+
// it's called from browser event loop
1030+
ep_rt_job_cb_t cb = (ep_rt_job_cb_t)job_func;
1031+
1032+
// invoke the callback inline for the first time
1033+
size_t done = cb (params);
1034+
1035+
// see if it's done or needs to be scheduled again
1036+
if (!done) {
1037+
// self schedule again
1038+
SystemJS_DiagnosticServerQueueJob (cb, params);
1039+
}
1040+
1041+
return true;
1042+
#else
1043+
EP_UNREACHABLE ("Not implemented on this platform");
1044+
#endif
1045+
}
1046+
1047+
#endif // PERFTRACING_DISABLE_THREADS
1048+
9321049
static
9331050
inline
9341051
void
@@ -942,6 +1059,7 @@ inline
9421059
void
9431060
ep_rt_thread_sleep (uint64_t ns)
9441061
{
1062+
#ifndef PERFTRACING_DISABLE_THREADS
9451063
STATIC_CONTRACT_NOTHROW;
9461064

9471065
#ifdef TARGET_UNIX
@@ -950,6 +1068,7 @@ ep_rt_thread_sleep (uint64_t ns)
9501068
const uint32_t NUM_NANOSECONDS_IN_1_MS = 1000000;
9511069
ClrSleepEx (static_cast<DWORD>(ns / NUM_NANOSECONDS_IN_1_MS), FALSE);
9521070
#endif //TARGET_UNIX
1071+
#endif // PERFTRACING_DISABLE_THREADS
9531072
}
9541073

9551074
static

src/coreclr/vm/eventtrace.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = {
5050
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { &MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context };
5151
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_DOTNET_Context = { &MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_EVENTPIPE_Context };
5252
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_DOTNET_Context = { &MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_EVENTPIPE_Context };
53+
#elif defined(HOST_BROWSER) || defined(HOST_WASI)
54+
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context };
55+
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context };
56+
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_EVENTPIPE_Context };
57+
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_EVENTPIPE_Context };
5358
#else
5459
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_LTTNG_Context };
5560
DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_LTTNG_Context };
@@ -2277,9 +2282,9 @@ void InitializeEventTracing()
22772282
// providers can do so now
22782283
ETW::TypeSystemLog::PostRegistrationInit();
22792284

2280-
#if defined(HOST_UNIX) && defined (FEATURE_PERFTRACING)
2285+
#if defined(HOST_UNIX) && !defined(HOST_BROWSER) && !defined(HOST_WASI) && defined(FEATURE_PERFTRACING)
22812286
XplatEventLogger::InitializeLogger();
2282-
#endif // HOST_UNIX && FEATURE_PERFTRACING
2287+
#endif // HOST_UNIX && !HOST_BROWSER && !HOST_WASI && FEATURE_PERFTRACING
22832288
}
22842289

22852290
// Plumbing to funnel event pipe callbacks and ETW callbacks together into a single common
@@ -5607,10 +5612,10 @@ bool EventPipeHelper::IsEnabled(DOTNET_TRACE_CONTEXT Context, UCHAR Level, ULONG
56075612
}
56085613
#endif // FEATURE_PERFTRACING
56095614

5610-
#if defined(HOST_UNIX) && defined(FEATURE_PERFTRACING)
5615+
#if defined(HOST_UNIX) && !defined(HOST_BROWSER) && !defined(HOST_WASI) && defined(FEATURE_PERFTRACING)
56115616
// This is a wrapper method for LTTng. See https://github.com/dotnet/coreclr/pull/27273 for details.
56125617
extern "C" bool XplatEventLoggerIsEnabled()
56135618
{
56145619
return XplatEventLogger::IsEventLoggingEnabled();
56155620
}
5616-
#endif // HOST_UNIX && FEATURE_PERFTRACING
5621+
#endif // HOST_UNIX && !HOST_BROWSER && !HOST_WASI && FEATURE_PERFTRACING

0 commit comments

Comments
 (0)