-
Notifications
You must be signed in to change notification settings - Fork 4.6k
/
ep-block.h
380 lines (315 loc) · 9.8 KB
/
ep-block.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
#ifndef __EVENTPIPE_BLOCK_H__
#define __EVENTPIPE_BLOCK_H__
#include "ep-rt-config.h"
#ifdef ENABLE_PERFTRACING
#include "ep-types.h"
#include "ep-stream.h"
#undef EP_IMPL_GETTER_SETTER
#ifdef EP_IMPL_BLOCK_GETTER_SETTER
#define EP_IMPL_GETTER_SETTER
#endif
#include "ep-getter-setter.h"
/*
* EventPipeBlock
*/
typedef void (*EventPipeBlockClearFunc)(void *object);
typedef uint32_t (*EventPipeBlockGetHeaderSizeFunc)(void *object);
typedef void (*EventPipeBlockSerializeHeaderFunc)(void *object, FastSerializer *fast_serializer);
struct _EventPipeBlockVtable {
FastSerializableObjectVtable fast_serializable_object_vtable;
EventPipeBlockClearFunc clear_func;
EventPipeBlockGetHeaderSizeFunc get_header_size_func;
EventPipeBlockSerializeHeaderFunc serialize_header_func;
};
// The base type for all file blocks in the Nettrace file format
// This class handles memory management to buffer the block data,
// bookkeeping, block version numbers, and serializing the data
// to the file with correct alignment.
// Sub-types decide the format of the block contents and how
// the blocks are named.
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeBlock {
#else
struct _EventPipeBlock_Internal {
#endif
FastSerializableObject fast_serializer_object;
uint8_t *block;
uint8_t *write_pointer;
uint8_t *end_of_the_buffer;
EventPipeSerializationFormat format;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeBlock {
uint8_t _internal [sizeof (struct _EventPipeBlock_Internal)];
};
#endif
EP_DEFINE_GETTER(EventPipeBlock *, block, uint8_t*, block)
EP_DEFINE_GETTER(EventPipeBlock *, block, uint8_t*, write_pointer)
EP_DEFINE_SETTER(EventPipeBlock *, block, uint8_t*, write_pointer)
EP_DEFINE_GETTER(EventPipeBlock *, block, uint8_t*, end_of_the_buffer)
EP_DEFINE_GETTER(EventPipeBlock *, block, EventPipeSerializationFormat, format)
static
inline
uint32_t
ep_block_get_bytes_written (const EventPipeBlock *block)
{
return block == NULL ? 0 : (uint32_t)(ep_block_get_write_pointer (block) - ep_block_get_block (block));
}
EventPipeBlock *
ep_block_init (
EventPipeBlock *block,
EventPipeBlockVtable *vtable,
uint32_t max_block_size,
EventPipeSerializationFormat format);
void
ep_block_fini (EventPipeBlock *block);
void
ep_block_clear (EventPipeBlock *block);
uint32_t
ep_block_get_header_size (EventPipeBlock *block);
void
ep_block_serialize_header (
EventPipeBlock *block,
FastSerializer *fast_serializer);
void
ep_block_fast_serialize (
EventPipeBlock *block,
FastSerializer *fast_serializer);
void
ep_block_clear_vcall (EventPipeBlock *block);
uint32_t
ep_block_get_header_size_vcall (EventPipeBlock *block);
void
ep_block_serialize_header_vcall (
EventPipeBlock *block,
FastSerializer *fast_serializer);
void
ep_block_fast_serialize_vcall (
EventPipeBlock *block,
FastSerializer *fast_serializer);
/*
* EventPipeEventHeader.
*/
struct _EventPipeEventHeader {
uint8_t activity_id [EP_ACTIVITY_ID_SIZE];
uint8_t related_activity_id [EP_ACTIVITY_ID_SIZE];
ep_timestamp_t timestamp;
uint64_t thread_id;
uint64_t capture_thread_id;
uint32_t metadata_id;
uint32_t sequence_number;
uint32_t capture_proc_number;
uint32_t stack_id;
uint32_t data_len;
};
/*
* EventPipeEventBlockBase
*/
// The base type for blocks that contain events (EventBlock and EventMetadataBlock).
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeEventBlockBase {
#else
struct _EventPipeEventBlockBase_Internal {
#endif
EventPipeBlock block;
EventPipeEventHeader last_header;
uint8_t compressed_header [100];
ep_timestamp_t min_timestamp;
ep_timestamp_t max_timestamp;
bool use_header_compression;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeEventBlockBase {
uint8_t _internal [sizeof (struct _EventPipeEventBlockBase_Internal)];
};
#endif
EP_DEFINE_GETTER_REF(EventPipeEventBlockBase *, event_block_base, EventPipeBlock *, block)
EP_DEFINE_GETTER_REF(EventPipeEventBlockBase *, event_block_base, EventPipeEventHeader *, last_header)
EP_DEFINE_GETTER(EventPipeEventBlockBase *, event_block_base, ep_timestamp_t, min_timestamp)
EP_DEFINE_SETTER(EventPipeEventBlockBase *, event_block_base, ep_timestamp_t, min_timestamp)
EP_DEFINE_GETTER(EventPipeEventBlockBase *, event_block_base, ep_timestamp_t, max_timestamp)
EP_DEFINE_SETTER(EventPipeEventBlockBase *, event_block_base, ep_timestamp_t, max_timestamp)
EP_DEFINE_GETTER(EventPipeEventBlockBase *, event_block_base, bool, use_header_compression)
EP_DEFINE_GETTER_ARRAY_REF(EventPipeEventBlockBase *, event_block_base, uint8_t *, const uint8_t *, compressed_header, compressed_header[0])
EventPipeEventBlockBase *
ep_event_block_base_init (
EventPipeEventBlockBase *event_block_base,
EventPipeBlockVtable *vtable,
uint32_t max_block_size,
EventPipeSerializationFormat format,
bool use_header_compression);
void
ep_event_block_base_fini (EventPipeEventBlockBase *event_block_base);
void
ep_event_block_base_clear (EventPipeEventBlockBase *event_block_base);
uint32_t
ep_event_block_base_get_header_size (const EventPipeEventBlockBase *event_block_base);
void
ep_event_block_base_serialize_header (
EventPipeEventBlockBase *event_block_base,
FastSerializer *fast_serializer);
bool
ep_event_block_base_write_event (
EventPipeEventBlockBase *event_block_base,
EventPipeEventInstance *event_instance,
uint64_t capture_thread_id,
uint32_t sequence_number,
uint32_t stack_id,
bool is_sorted_event);
/*
* EventPipeEventBlock.
*/
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeEventBlock {
#else
struct _EventPipeEventBlock_Internal {
#endif
EventPipeEventBlockBase event_block_base;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeEventBlock {
uint8_t _internal [sizeof (struct _EventPipeEventBlock_Internal)];
};
#endif
EventPipeEventBlock *
ep_event_block_alloc (
uint32_t max_block_size,
EventPipeSerializationFormat format);
void
ep_event_block_free (EventPipeEventBlock *event_block);
static
inline
uint32_t
ep_event_block_get_bytes_written (EventPipeEventBlock *event_block)
{
return ep_block_get_bytes_written ((const EventPipeBlock *)event_block);
}
static
inline
void
ep_event_block_serialize (EventPipeEventBlock *event_block, FastSerializer *fast_serializer)
{
ep_fast_serializer_write_object (fast_serializer, (FastSerializableObject*)event_block);
}
static
inline
void
ep_event_block_clear (EventPipeEventBlock *event_block)
{
ep_block_clear_vcall ((EventPipeBlock *)event_block);
}
/*
* EventPipeMetadataBlock.
*/
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeMetadataBlock {
#else
struct _EventPipeMetadataBlock_Internal {
#endif
EventPipeEventBlockBase event_block_base;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeMetadataBlock {
uint8_t _internal [sizeof (struct _EventPipeMetadataBlock_Internal)];
};
#endif
EventPipeMetadataBlock *
ep_metadata_block_alloc (uint32_t max_block_size);
void
ep_metadata_block_free (EventPipeMetadataBlock *metadata_block);
static
inline
uint32_t
ep_metadata_block_get_bytes_written (EventPipeMetadataBlock *metadata_block)
{
return ep_block_get_bytes_written ((const EventPipeBlock *)metadata_block);
}
static
inline
void
ep_metadata_block_serialize (EventPipeMetadataBlock *metadata_block, FastSerializer *fast_serializer)
{
ep_fast_serializer_write_object (fast_serializer, (FastSerializableObject *)metadata_block);
}
static
inline
void
ep_metadata_block_clear (EventPipeMetadataBlock *metadata_block)
{
ep_block_clear_vcall ((EventPipeBlock *)metadata_block);
}
/*
* EventPipeSequencePointBlock.
*/
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeSequencePointBlock {
#else
struct _EventPipeSequencePointBlock_Internal {
#endif
EventPipeBlock block;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeSequencePointBlock {
uint8_t _internal [sizeof (struct _EventPipeSequencePointBlock_Internal)];
};
#endif
EventPipeSequencePointBlock *
ep_sequence_point_block_alloc (EventPipeSequencePoint *sequence_point);
EventPipeSequencePointBlock *
ep_sequence_point_block_init (
EventPipeSequencePointBlock *sequence_point_block,
EventPipeSequencePoint *sequence_point);
void
ep_sequence_point_block_fini (EventPipeSequencePointBlock *sequence_point_block);
void
ep_sequence_point_block_free (EventPipeSequencePointBlock *sequence_point_block);
/*
* EventPipeStackBlock.
*/
#if defined(EP_INLINE_GETTER_SETTER) || defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeStackBlock {
#else
struct _EventPipeStackBlock_Internal {
#endif
EventPipeBlock block;
uint32_t initial_index;
uint32_t count;
bool has_initial_index;
};
#if !defined(EP_INLINE_GETTER_SETTER) && !defined(EP_IMPL_BLOCK_GETTER_SETTER)
struct _EventPipeStackBlock {
uint8_t _internal [sizeof (struct _EventPipeStackBlock_Internal)];
};
#endif
EventPipeStackBlock *
ep_stack_block_alloc (uint32_t max_block_size);
void
ep_stack_block_free (EventPipeStackBlock *stack_block);
bool
ep_stack_block_write_stack (
EventPipeStackBlock *stack_block,
uint32_t stack_id,
EventPipeStackContentsInstance *stack);
static
inline
uint32_t
ep_stack_block_get_bytes_written (EventPipeStackBlock *stack_block)
{
return ep_block_get_bytes_written ((const EventPipeBlock *)stack_block);
}
static
inline
void
ep_stack_block_serialize (EventPipeStackBlock *stack_block, FastSerializer *fast_serializer)
{
ep_fast_serializer_write_object (fast_serializer, (FastSerializableObject *)stack_block);
}
static
inline
void
ep_stack_block_clear (EventPipeStackBlock *stack_block)
{
ep_block_clear_vcall ((EventPipeBlock *)stack_block);
}
#endif /* ENABLE_PERFTRACING */
#endif /* __EVENTPIPE_BLOCK_H__ */