Monado OpenXR Runtime
Loading...
Searching...
No Matches
u_trace_marker.h
Go to the documentation of this file.
1// Copyright 2020-2022, Collabora, Ltd.
2// Copyright 2024-2025, NVIDIA CORPORATION.
3// Copyright 2026, Beyley Cardellio
4// SPDX-License-Identifier: BSL-1.0
5/*!
6 * @file
7 * @brief Tracing support code, see @ref tracing.
8 * @author Jakob Bornecrantz <jakob@collabora.com>
9 * @ingroup aux_util
10 */
11
12#pragma once
13
14#include "xrt/xrt_compiler.h"
15#include "xrt/xrt_config_os.h"
16#include "xrt/xrt_config_have.h"
17#include "xrt/xrt_config_build.h" // IWYU pragma: keep
18
19#include <stdio.h>
20
21#if defined(XRT_FEATURE_TRACING) && defined(XRT_HAVE_PERCETTO)
22#define U_TRACE_PERCETTO
23#include <percetto.h>
24#endif
25
26#if !defined(XRT_FEATURE_TRACING) || !defined(XRT_HAVE_TRACY)
27#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
28 (void)COLOR; \
29 U_TRACE_FUNC(CATEGORY)
30
31#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
32 (void)COLOR; \
33 U_TRACE_IDENT(CATEGORY, IDENT)
34
35#define U_TRACE_BEGIN_COLOR(CATEGORY, IDENT, COLOR) \
36 (void)COLOR; \
37 U_TRACE_BEGIN(CATEGORY, IDENT)
38#endif
39
40#if defined(XRT_FEATURE_TRACING) && defined(XRT_HAVE_TRACY)
41#ifndef TRACY_ENABLE
42#define TRACY_ENABLE
43#endif // TRACY_ENABLE
44#define U_TRACE_TRACY
45#include "tracy/TracyC.h"
46#ifdef __cplusplus
47#include "tracy/Tracy.hpp"
48#endif
49#endif
50
51
52#ifdef __cplusplus
53extern "C" {
54#endif
55
56/*!
57 * Should the extra tracks be enabled, see @ref tracing.
58 *
59 * @ingroup aux_util
60 */
62{
63 U_TRACE_WHICH_SERVICE,
64 U_TRACE_WHICH_OPENXR,
65 U_TRACE_WHICH_OPENVR,
66};
67
68/*!
69 * Internal setup function, use @ref U_TRACE_TARGET_SETUP, see @ref tracing.
70 *
71 * @ingroup aux_util
72 */
73void
75
76/*!
77 * Must be called from a non-static/global constructor context.
78 *
79 * @ingroup aux_util
80 */
81void
83
84#define COLOR_TRACE_MARKER(COLOR) U_TRACE_FUNC_COLOR(color, COLOR)
85#define COLOR_TRACE_IDENT(IDENT, COLOR) U_TRACE_IDENT_COLOR(color, IDENT, COLOR)
86#define COLOR_TRACE_BEGIN(IDENT, COLOR) U_TRACE_BEGIN_COLOR(color, IDENT, COLOR)
87#define COLOR_TRACE_END(IDENT) U_TRACE_END(color, IDENT)
88
89#define VK_TRACE_MARKER() U_TRACE_FUNC_COLOR(vk, 0xffffff)
90#define VK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(vk, IDENT, 0xffffff)
91#define VK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(vk, IDENT, 0xffffff)
92#define VK_TRACE_END(IDENT) U_TRACE_END(vk, IDENT)
93// Markers for sub-zones within a Vulkan marked zone.
94#define VK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x491556)
95#define VK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x324ff2)
96#define VK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xabc9c8)
97#define VK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc12a8a)
98
99#define XRT_TRACE_MARKER() U_TRACE_FUNC_COLOR(xrt, 0x708090)
100#define XRT_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(xrt, IDENT, 0x708090)
101#define XRT_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(xrt, IDENT, 0x708090)
102#define XRT_TRACE_END(IDENT) U_TRACE_END(xrt, IDENT)
103// Markers for sub-zones within a driver marked zone.
104#define XRT_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x1e1447)
105#define XRT_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x404444)
106#define XRT_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0c080b)
107#define XRT_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xeff9d6)
108
109#define DRV_TRACE_MARKER() U_TRACE_FUNC_COLOR(drv, 0x000080)
110#define DRV_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(drv, IDENT, 0x000080)
111#define DRV_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(drv, IDENT, 0x000080)
112#define DRV_TRACE_END(IDENT) U_TRACE_END(drv, IDENT)
113// Markers for sub-zones within a driver marked zone.
114#define DRV_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x000107)
115#define DRV_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc9bad3)
116#define DRV_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x1bb4ba)
117#define DRV_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x05080a)
118
119#define IPC_TRACE_MARKER() U_TRACE_FUNC_COLOR(ipc, 0x87cefa)
120#define IPC_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(ipc, IDENT, 0x87cefa)
121#define IPC_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(ipc, IDENT, 0x87cefa)
122#define IPC_TRACE_END(IDENT) U_TRACE_END(ipc, IDENT)
123// Markers for sub-zones within a IPC marked zone.
124#define IPC_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xc934d3)
125#define IPC_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x010f05)
126#define IPC_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x050707)
127#define IPC_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0c0108)
128
129#define OXR_TRACE_MARKER() U_TRACE_FUNC_COLOR(oxr, 0x7fffd4)
130#define OXR_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(oxr, IDENT, 0x7fffd4)
131#define OXR_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(oxr, IDENT, 0x7fffd4)
132#define OXR_TRACE_END(IDENT) U_TRACE_END(oxr, IDENT, 0x7fffd4)
133// Markers for sub-zones within a OpenXR marked zone.
134#define OXR_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xb06044)
135#define OXR_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xe8e7e5)
136#define OXR_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x135584)
137#define OXR_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x20eac5)
138
139#define COMP_TRACE_MARKER() U_TRACE_FUNC_COLOR(comp, 0x00ff00)
140#define COMP_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x00ff00)
141#define COMP_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(comp, IDENT, 0x00ff00)
142#define COMP_TRACE_END(IDENT) U_TRACE_END(comp, IDENT)
143// Markers for sub-zones within a compositor marked zone.
144#define COMP_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xff2312)
145#define COMP_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x2312ff)
146#define COMP_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x33a012)
147#define COMP_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x88a0d2)
148
149#define SINK_TRACE_MARKER() U_TRACE_FUNC_COLOR(sink, 0xffa500)
150#define SINK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(sink, IDENT, 0xffa500)
151#define SINK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(sink, IDENT, 0xffa500)
152#define SINK_TRACE_END(IDENT) U_TRACE_END(sink, IDENT)
153// Markers for sub-zones within a sink marked zone.
154#define SINK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x898368)
155#define SINK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x026d09)
156#define SINK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa6eda1)
157#define SINK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x233f93)
158
159#define SWAPCHAIN_TRACE_MARKER() U_TRACE_FUNC_COLOR(sc, 0x007700)
160#define SWAPCHAIN_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(sc, IDENT, 0x007700)
161#define SWAPCHAIN_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(sc, IDENT, 0x007700)
162#define SWAPCHAIN_TRACE_END(IDENT) U_TRACE_END(sc, IDENT)
163// Markers for sub-zones within a swap chain marked zone.
164#define SWAPCHAIN_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa4a4f2)
165#define SWAPCHAIN_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x376349)
166#define SWAPCHAIN_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xa0766a)
167#define SWAPCHAIN_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0xacdce0)
168
169#define TRACK_TRACE_MARKER() U_TRACE_FUNC_COLOR(track, 0xff0000)
170#define TRACK_TRACE_IDENT(IDENT) U_TRACE_IDENT_COLOR(track, IDENT, 0xff0000)
171#define TRACK_TRACE_BEGIN(IDENT) U_TRACE_BEGIN_COLOR(track, IDENT, 0xff0000)
172#define TRACK_TRACE_END(IDENT) U_TRACE_END(track, IDENT, 0xff0000)
173// Markers for sub-zones within a track marked zone.
174#define TRACK_TRACE_IDENT_SUBZONE1(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x384949)
175#define TRACK_TRACE_IDENT_SUBZONE2(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x373d1e)
176#define TRACK_TRACE_IDENT_SUBZONE3(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x053d37)
177#define TRACK_TRACE_IDENT_SUBZONE4(IDENT) U_TRACE_IDENT_COLOR(comp, IDENT, 0x0b223f)
178
179
180/*
181 *
182 * When disabled.
183 *
184 */
185
186#ifndef XRT_FEATURE_TRACING
187
188
189#define U_TRACE_FUNC(CATEGORY) \
190 do { \
191 } while (false)
192
193#define U_TRACE_IDENT(CATEGORY, IDENT) \
194 do { \
195 } while (false)
196
197#define U_TRACE_BEGIN(CATEGORY, IDENT) \
198 int __trace_##IDENT = 0; /* To ensure they are balanced */ \
199 do { \
200 } while (false)
201
202#define U_TRACE_END(CATEGORY, IDENT) \
203 do { \
204 (void)__trace_##IDENT; /* To ensure they are balanced */ \
205 } while (false)
206
207#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
208 do { \
209 } while (false)
210
211#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
212 do { \
213 } while (false)
214
215#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) \
216 do { \
217 } while (false)
218
219#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
220 do { \
221 } while (false)
222
223#define U_TRACE_CATEGORY_IS_ENABLED(_) (false)
224
225#define U_TRACE_SET_THREAD_NAME(STRING) \
226 do { \
227 (void)STRING; \
228 } while (false)
229
230/*!
231 * Add to target c file to enable tracing, see @ref tracing.
232 *
233 * @ingroup aux_util
234 */
235#define U_TRACE_TARGET_SETUP(WHICH)
236
237
238/*
239 *
240 * Tracy support.
241 *
242 */
243
244#elif defined(XRT_HAVE_TRACY) // && XRT_FEATURE_TRACING
245
246// Different wrappers for different cases.
247#ifdef __cplusplus
248
249#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) ZoneScopedC(COLOR)
250
251#define U_TRACE_FUNC(CATEGORY) ZoneScoped
252
253#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) ZoneScopedNC(#IDENT, COLOR)
254
255#define U_TRACE_IDENT(CATEGORY, IDENT) ZoneScopedN(#IDENT)
256
257#elif !defined(XRT_OS_WINDOWS) || defined(__clang__) // !__cplusplus
258
259static inline void
260u_trace_scope_cleanup(TracyCZoneCtx *ctx_ptr)
261{
262 TracyCZoneEnd(*ctx_ptr);
263}
264
265#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
266 static const struct ___tracy_source_location_data __func_loc = { \
267 NULL, __func__, __FILE__, (uint32_t)__LINE__, COLOR, \
268 }; \
269 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx = \
270 ___tracy_emit_zone_begin(&__func_loc, true); \
271 (void)ctx
272
273
274#define U_TRACE_FUNC(CATEGORY) \
275 static const struct ___tracy_source_location_data __func_loc = { \
276 NULL, __func__, __FILE__, (uint32_t)__LINE__, 0, \
277 }; \
278 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx = \
279 ___tracy_emit_zone_begin(&__func_loc, true); \
280 (void)ctx
281
282#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
283 static const struct ___tracy_source_location_data __##IDENT##_loc = { \
284 #IDENT, __func__, __FILE__, (uint32_t)__LINE__, COLOR, \
285 }; \
286 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx##IDENT = \
287 ___tracy_emit_zone_begin(&__##IDENT##_loc, true); \
288 (void)ctx##IDENT
289
290#define U_TRACE_IDENT(CATEGORY, IDENT) \
291 static const struct ___tracy_source_location_data __##IDENT##_loc = { \
292 #IDENT, __func__, __FILE__, (uint32_t)__LINE__, 0, \
293 }; \
294 TracyCZoneCtx __attribute__((cleanup(u_trace_scope_cleanup))) ctx##IDENT = \
295 ___tracy_emit_zone_begin(&__##IDENT##_loc, true); \
296 (void)ctx##IDENT
297
298#else // !XRT_OS_WINDOWS && !__cplusplus
299#define U_TRACE_FUNC_COLOR(CATEGORY, COLOR) \
300 do { \
301 } while (false)
302
303#define U_TRACE_FUNC(CATEGORY) \
304 do { \
305 } while (false)
306
307#define U_TRACE_IDENT_COLOR(CATEGORY, IDENT, COLOR) \
308 do { \
309 } while (false)
310
311#define U_TRACE_IDENT(CATEGORY, IDENT) \
312 do { \
313 } while (false)
314
315#endif // !XRT_OS_WINDOWS && !__cplusplus
316
317#define U_TRACE_BEGIN(CATEGORY, IDENT) TracyCZoneN(__trace_##IDENT, #IDENT, true)
318#define U_TRACE_BEGIN_COLOR(CATEGORY, IDENT, COLOR) TracyCZoneNC(__trace_##IDENT, #IDENT, COLOR, true)
319#define U_TRACE_END(CATEGORY, IDENT) TracyCZoneEnd(__trace_##IDENT)
320
321#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
322 do { \
323 } while (false)
324
325#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
326 do { \
327 } while (false)
328
329#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) \
330 do { \
331 } while (false)
332
333#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
334 do { \
335 } while (false)
336
337#define U_TRACE_CATEGORY_IS_ENABLED(_) (true) // All categories are always enabled with Tracy.
338
339#define U_TRACE_SET_THREAD_NAME(STRING) \
340 do { \
341 /* To help with thread ordering and seeing when a thread is created. */ \
342 TracyCZoneN(created, "created", true); \
343 TracyCSetThreadName(STRING); \
344 TracyCZoneEnd(created); \
345 } while (false)
346
347#define U_TRACE_TARGET_SETUP(WHICH)
348
349
350/*
351 *
352 * Percetto support.
353 *
354 */
355
356#elif defined(XRT_HAVE_PERCETTO) // && XRT_FEATURE_TRACKING && !XRT_HAVE_TRACY
357
358#ifndef XRT_OS_LINUX
359#error "Tracing only supported on Linux"
360#endif
361
362
363#define U_TRACE_CATEGORIES(C, G) \
364 C(vk, "vk") /* Vulkan calls */ \
365 C(xrt, "xrt") /* Misc XRT calls */ \
366 C(drv, "drv") /* Driver calls */ \
367 C(ipc, "ipc") /* IPC calls */ \
368 C(oxr, "st/oxr") /* OpenXR State Tracker calls */ \
369 C(sink, "sink") /* Sink/frameserver calls */ \
370 C(comp, "comp") /* Compositor calls */ \
371 C(sc, "sc") /* Swapchain calls */ \
372 C(track, "track") /* Tracking calls */ \
373 C(timing, "timing") /* Timing calls */
374
375PERCETTO_CATEGORY_DECLARE(U_TRACE_CATEGORIES)
376
377PERCETTO_TRACK_DECLARE(pc_cpu);
378PERCETTO_TRACK_DECLARE(pc_allotted);
379PERCETTO_TRACK_DECLARE(pc_gpu);
380PERCETTO_TRACK_DECLARE(pc_margin);
381PERCETTO_TRACK_DECLARE(pc_error);
382PERCETTO_TRACK_DECLARE(pc_info);
383PERCETTO_TRACK_DECLARE(pc_present);
384PERCETTO_TRACK_DECLARE(pa_cpu);
385PERCETTO_TRACK_DECLARE(pa_draw);
386PERCETTO_TRACK_DECLARE(pa_wait);
387
388#define U_TRACE_FUNC(CATEGORY) TRACE_EVENT(CATEGORY, __func__)
389#define U_TRACE_IDENT(CATEGORY, IDENT) TRACE_EVENT(CATEGORY, #IDENT)
390#define U_TRACE_BEGIN(CATEGORY, IDENT) TRACE_EVENT_BEGIN(CATEGORY, #IDENT)
391#define U_TRACE_END(CATEGORY, IDENT) TRACE_EVENT_END(CATEGORY)
392#define U_TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
393 TRACE_EVENT_BEGIN_ON_TRACK(CATEGORY, TRACK, TIME, NAME)
394#define U_TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, ...) \
395 TRACE_EVENT_BEGIN_ON_TRACK_DATA(CATEGORY, TRACK, TIME, NAME, __VA_ARGS__)
396#define U_TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME) TRACE_EVENT_END_ON_TRACK(CATEGORY, TRACK, TIME)
397#define U_TRACE_CATEGORY_IS_ENABLED(CATEGORY) PERCETTO_CATEGORY_IS_ENABLED(CATEGORY)
398#define U_TRACE_INSTANT_ON_TRACK(CATEGORY, TRACK, TIME, NAME) \
399 TRACE_ANY_WITH_ARGS(PERCETTO_EVENT_INSTANT, CATEGORY, &g_percetto_track_##TRACK, TIME, NAME, 0)
400#define U_TRACE_DATA(fd, type, data) u_trace_data(fd, type, (void *)&(data), sizeof(data))
401
402#define U_TRACE_SET_THREAD_NAME(STRING) \
403 do { \
404 (void)STRING; \
405 } while (false)
406
407#define U_TRACE_TARGET_SETUP(WHICH) \
408 void __attribute__((constructor(101))) u_trace_marker_constructor(void); \
409 \
410 void u_trace_marker_constructor(void) \
411 { \
412 u_trace_marker_setup(WHICH); \
413 }
414
415#else // !XRT_FEATURE_TRACING && !XRT_HAVE_PERCETTO && !XRT_HAVE_TRACY
416
417#error "Need to have Percetto/Perfetto"
418
419#endif // Error checking
420
421
422#ifdef __cplusplus
423}
424#endif
u_trace_which
Should the extra tracks be enabled, see Tracing support.
Definition u_trace_marker.h:62
void u_trace_marker_setup(enum u_trace_which which)
Internal setup function, use U_TRACE_TARGET_SETUP, see Tracing support.
Definition u_trace_marker.c:95
void u_trace_marker_init(void)
Must be called from a non-static/global constructor context.
Definition u_trace_marker.c:103
Header holding common defines.
Auto detect OS and certain features.