/
ep.h
404 lines (340 loc) · 7.84 KB
/
ep.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
#ifndef __EVENTPIPE_H__
#define __EVENTPIPE_H__
#include "ep-rt-config.h"
#ifdef ENABLE_PERFTRACING
#include "ep-types.h"
#include "ep-stack-contents.h"
#include "ep-rt.h"
extern volatile EventPipeState _ep_state;
extern volatile EventPipeSession *_ep_sessions [EP_MAX_NUMBER_OF_SESSIONS];
extern volatile uint32_t _ep_number_of_sessions;
extern volatile uint64_t _ep_allow_write;
/*
* Globals and volatile access functions.
*/
static
inline
EventPipeState
ep_volatile_load_eventpipe_state (void)
{
return (EventPipeState)ep_rt_volatile_load_uint32_t ((const volatile uint32_t *)&_ep_state);
}
static
inline
EventPipeState
ep_volatile_load_eventpipe_state_without_barrier (void)
{
return (EventPipeState)ep_rt_volatile_load_uint32_t_without_barrier ((const volatile uint32_t *)&_ep_state);
}
static
inline
void
ep_volatile_store_eventpipe_state (EventPipeState state)
{
ep_rt_volatile_store_uint32_t ((volatile uint32_t *)&_ep_state, state);
}
static
inline
EventPipeSession *
ep_volatile_load_session (size_t index)
{
return (EventPipeSession *)ep_rt_volatile_load_ptr ((volatile void **)(&_ep_sessions [index]));
}
static
inline
EventPipeSession *
ep_volatile_load_session_without_barrier (size_t index)
{
return (EventPipeSession *)ep_rt_volatile_load_ptr_without_barrier ((volatile void **)(&_ep_sessions [index]));
}
static
inline
void
ep_volatile_store_session (size_t index, EventPipeSession *session)
{
ep_rt_volatile_store_ptr ((volatile void **)(&_ep_sessions [index]), session);
}
static
inline
uint32_t
ep_volatile_load_number_of_sessions (void)
{
return ep_rt_volatile_load_uint32_t (&_ep_number_of_sessions);
}
static
inline
uint32_t
ep_volatile_load_number_of_sessions_without_barrier (void)
{
return ep_rt_volatile_load_uint32_t_without_barrier (&_ep_number_of_sessions);
}
static
inline
void
ep_volatile_store_number_of_sessions (uint32_t number_of_sessions)
{
ep_rt_volatile_store_uint32_t (&_ep_number_of_sessions, number_of_sessions);
}
static
inline
uint64_t
ep_volatile_load_allow_write (void)
{
return ep_rt_volatile_load_uint64_t (&_ep_allow_write);
}
static
inline
void
ep_volatile_store_allow_write (uint64_t allow_write)
{
ep_rt_volatile_store_uint64_t (&_ep_allow_write, allow_write);
}
/*
* EventPipe.
*/
#ifdef EP_CHECKED_BUILD
void
ep_requires_lock_held (void);
void
ep_requires_lock_not_held (void);
#else
#define ep_requires_lock_held()
#define ep_requires_lock_not_held()
#endif
EventPipeSessionID
ep_enable (
const ep_char8_t *output_path,
uint32_t circular_buffer_size_in_mb,
const EventPipeProviderConfiguration *providers,
uint32_t providers_len,
EventPipeSessionType session_type,
EventPipeSerializationFormat format,
bool rundown_requested,
IpcStream *stream,
EventPipeSessionSynchronousCallback sync_callback,
void *callback_additional_data);
EventPipeSessionID
ep_enable_2 (
const ep_char8_t *output_path,
uint32_t circular_buffer_size_in_mb,
const ep_char8_t *providers,
EventPipeSessionType session_type,
EventPipeSerializationFormat format,
bool rundown_requested,
IpcStream *stream,
EventPipeSessionSynchronousCallback sync_callback,
void *callback_additional_data);
void
ep_disable (EventPipeSessionID id);
EventPipeSession *
ep_get_session (EventPipeSessionID session_id);
bool
ep_is_session_enabled (EventPipeSessionID session_id);
void
ep_start_streaming (EventPipeSessionID session_id);
bool
ep_enabled (void);
EventPipeProvider *
ep_create_provider (
const ep_char8_t *provider_name,
EventPipeCallback callback_func,
void *callback_data);
void
ep_delete_provider (EventPipeProvider *provider);
EventPipeProvider *
ep_get_provider (const ep_char8_t *provider_name);
bool
ep_add_provider_to_session (
EventPipeSessionProvider *provider,
EventPipeSession *session);
void
ep_init (void);
void
ep_finish_init (void);
void
ep_shutdown (void);
EventPipeEventMetadataEvent *
ep_build_event_metadata_event (
EventPipeEventInstance *event_instance,
uint32_t metadata_id);
void
ep_write_event (
EventPipeEvent *ep_event,
uint8_t *data,
uint32_t data_len,
const uint8_t *activity_id,
const uint8_t *related_activity_id);
void
ep_write_event_2 (
EventPipeEvent *ep_event,
EventData *event_data,
uint32_t event_data_len,
const uint8_t *activity_id,
const uint8_t *related_activity_id);
void
ep_write_sample_profile_event (
ep_rt_thread_handle_t sampling_thread,
EventPipeEvent *ep_event,
ep_rt_thread_handle_t target_thread,
EventPipeStackContents *stack,
uint8_t *event_data,
uint32_t event_data_len);
EventPipeEventInstance *
ep_get_next_event (EventPipeSessionID session_id);
EventPipeWaitHandle
ep_get_wait_handle (EventPipeSessionID session_id);
static
inline
bool
ep_walk_managed_stack_for_current_thread (EventPipeStackContents *stack_contents)
{
EP_ASSERT (stack_contents != NULL);
ep_stack_contents_reset (stack_contents);
ep_rt_thread_handle_t thread = ep_rt_thread_get_handle ();
return (thread != NULL) ? ep_rt_walk_managed_stack_for_thread (thread, stack_contents) : false;
}
bool
ep_add_rundown_execution_checkpoint (
const ep_char8_t *name,
ep_timestamp_t timestamp);
/*
* EventPipePerf.
*/
static
inline
ep_timestamp_t
ep_perf_timestamp_get (void)
{
return (ep_timestamp_t)ep_rt_perf_counter_query ();
}
static
inline
int64_t
ep_perf_frequency_query (void)
{
return ep_rt_perf_frequency_query ();
}
/*
* EventPipeSystemTime.
*/
static
inline
ep_system_timestamp_t
ep_system_timestamp_get (void)
{
return (ep_system_timestamp_t)ep_rt_system_timestamp_get ();
}
static
inline
void
ep_system_time_get (EventPipeSystemTime *system_time)
{
ep_rt_system_time_get (system_time);
}
/*
* EventPipeIpcStreamFactoryCallback.
*/
void
ep_ipc_stream_factory_callback_set (EventPipeIpcStreamFactorySuspendedPortsCallback suspended_ports_callback);
/*
* EventPipeWriteBuffer.
*/
static
inline
uint32_t
ep_write_buffer_uint8_t (uint8_t **buffer, uint8_t value)
{
memcpy (*buffer, &value, sizeof (value));
*buffer += sizeof (value);
return sizeof (value);
}
#define EP_WRITE_BUFFER_INT(BITS, SIGNEDNESS) \
static \
inline \
uint32_t \
ep_write_buffer_##SIGNEDNESS##int##BITS##_t (uint8_t **buffer, SIGNEDNESS##int##BITS##_t value) \
{ \
value = ep_rt_val_##SIGNEDNESS##int##BITS##_t (value); \
memcpy (*buffer, &value, sizeof (value)); \
*buffer += sizeof (value); \
return sizeof (value); \
}
EP_WRITE_BUFFER_INT (16, )
EP_WRITE_BUFFER_INT (16, u)
EP_WRITE_BUFFER_INT (32, )
EP_WRITE_BUFFER_INT (32, u)
EP_WRITE_BUFFER_INT (64, )
EP_WRITE_BUFFER_INT (64, u)
#undef EP_WRITE_BUFFER_INT
static
inline
uint32_t
ep_write_buffer_uintptr_t (uint8_t **buffer, uintptr_t value)
{
value = ep_rt_val_uintptr_t (value);
memcpy (*buffer, &value, sizeof (value));
*buffer += sizeof (value);
return sizeof (value);
}
static
inline
uint32_t
ep_write_buffer_string_utf8_to_utf16_t (uint8_t **buf, const ep_char8_t *str, uint32_t len)
{
if (len == 0) {
(*buf)[0] = 0;
(*buf)[1] = 0;
*buf += sizeof (ep_char16_t);
return sizeof (ep_char16_t);
}
ep_char16_t *str_utf16 = ep_rt_utf8_to_utf16le_string (str, len);
uint32_t num_bytes_utf16_str = 0;
while (str_utf16[num_bytes_utf16_str] != 0)
++num_bytes_utf16_str;
num_bytes_utf16_str = (num_bytes_utf16_str + 1) * sizeof (ep_char16_t);
memcpy (*buf, str_utf16, num_bytes_utf16_str);
*buf += num_bytes_utf16_str;
ep_rt_utf16_string_free (str_utf16);
return num_bytes_utf16_str;
}
static
inline
uint32_t
ep_write_buffer_string_utf16_t (uint8_t **buf, const ep_char16_t *str, uint32_t len)
{
uint32_t num_bytes = (len + 1) * sizeof (ep_char16_t);
memcpy (*buf, str, num_bytes);
*buf += num_bytes;
return num_bytes;
}
static
inline
uint32_t
ep_write_buffer_timestamp (uint8_t **buffer, ep_timestamp_t value)
{
return ep_write_buffer_int64_t (buffer, value);
}
#else /* ENABLE_PERFTRACING */
static
inline
void
ep_init (void)
{
;
}
static
inline
void
ep_finish_init (void)
{
;
}
static
inline
void
ep_shutdown (void)
{
;
}
#endif /* ENABLE_PERFTRACING */
#endif /* __EVENTPIPE_H__ */