Zephyr Project API 4.0.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
tracing_macros.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_
7#define ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_
8
10
11#if !defined(CONFIG_TRACING) && !defined(__DOXYGEN__)
12
13#define SYS_PORT_TRACING_FUNC(type, func, ...) do { } while (false)
14#define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...) do { } while (false)
15#define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...) do { } while (false)
16#define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...) do { } while (false)
17#define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) do { } while (false)
18#define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) do { } while (false)
19#define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) do { } while (false)
20#define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, ...) do { } while (false)
21#define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) do { } while (false)
22
23#define SYS_PORT_TRACING_TRACKING_FIELD(type)
24
25#else
26
36/*
37 * Helper macros used by the extended tracing system
38 */
39
40#define _SYS_PORT_TRACING_TYPE_MASK(type) \
41 sys_port_trace_type_mask_ ## type
42#define _SYS_PORT_TRACING_FUNC(name, func) \
43 sys_port_trace_ ## name ## _ ## func
44#define _SYS_PORT_TRACING_FUNC_ENTER(name, func) \
45 sys_port_trace_ ## name ## _ ## func ## _enter
46#define _SYS_PORT_TRACING_FUNC_BLOCKING(name, func) \
47 sys_port_trace_ ## name ## _ ## func ## _blocking
48#define _SYS_PORT_TRACING_FUNC_EXIT(name, func) \
49 sys_port_trace_ ## name ## _ ## func ## _exit
50#define _SYS_PORT_TRACING_OBJ_INIT(name) \
51 sys_port_trace_ ## name ## _init
52#define _SYS_PORT_TRACING_OBJ_FUNC(name, func) \
53 sys_port_trace_ ## name ## _ ## func
54#define _SYS_PORT_TRACING_OBJ_FUNC_ENTER(name, func) \
55 sys_port_trace_ ## name ## _ ## func ## _enter
56#define _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(name, func) \
57 sys_port_trace_ ## name ## _ ## func ## _blocking
58#define _SYS_PORT_TRACING_OBJ_FUNC_EXIT(name, func) \
59 sys_port_trace_ ## name ## _ ## func ## _exit
60
61/*
62 * Helper macros for the object tracking system
63 */
64
65#define _SYS_PORT_TRACKING_OBJ_INIT(name) \
66 sys_port_track_ ## name ## _init
67#define _SYS_PORT_TRACKING_OBJ_FUNC(name, func) \
68 sys_port_track_ ## name ## _ ## func
69
70/*
71 * Object trace macros part of the system for checking if certain
72 * objects should be traced or not depending on the tracing configuration.
73 */
74#if defined(CONFIG_TRACING_THREAD)
75 #define sys_port_trace_type_mask_k_thread(trace_call) trace_call
76#else
77 #define sys_port_trace_type_mask_k_thread(trace_call)
78 #define sys_port_trace_k_thread_is_disabled 1
79#endif
80
81#if defined(CONFIG_TRACING_WORK)
82 #define sys_port_trace_type_mask_k_work(trace_call) trace_call
83 #define sys_port_trace_type_mask_k_work_queue(trace_call) trace_call
84 #define sys_port_trace_type_mask_k_work_delayable(trace_call) trace_call
85 #define sys_port_trace_type_mask_k_work_poll(trace_call) trace_call
86#else
87 #define sys_port_trace_type_mask_k_work(trace_call)
88 #define sys_port_trace_type_mask_k_work_queue(trace_call)
89 #define sys_port_trace_type_mask_k_work_delayable(trace_call)
90 #define sys_port_trace_type_mask_k_work_poll(trace_call)
91#endif
92
93#if defined(CONFIG_TRACING_SEMAPHORE)
94 #define sys_port_trace_type_mask_k_sem(trace_call) trace_call
95#else
96 #define sys_port_trace_type_mask_k_sem(trace_call)
97#endif
98
99#if defined(CONFIG_TRACING_MUTEX)
100 #define sys_port_trace_type_mask_k_mutex(trace_call) trace_call
101#else
102 #define sys_port_trace_type_mask_k_mutex(trace_call)
103#endif
104
105#if defined(CONFIG_TRACING_CONDVAR)
106 #define sys_port_trace_type_mask_k_condvar(trace_call) trace_call
107#else
108 #define sys_port_trace_type_mask_k_condvar(trace_call)
109#endif
110
111#if defined(CONFIG_TRACING_QUEUE)
112 #define sys_port_trace_type_mask_k_queue(trace_call) trace_call
113#else
114 #define sys_port_trace_type_mask_k_queue(trace_call)
115#endif
116
117#if defined(CONFIG_TRACING_FIFO)
118 #define sys_port_trace_type_mask_k_fifo(trace_call) trace_call
119#else
120 #define sys_port_trace_type_mask_k_fifo(trace_call)
121#endif
122
123#if defined(CONFIG_TRACING_LIFO)
124 #define sys_port_trace_type_mask_k_lifo(trace_call) trace_call
125#else
126 #define sys_port_trace_type_mask_k_lifo(trace_call)
127#endif
128
129#if defined(CONFIG_TRACING_STACK)
130 #define sys_port_trace_type_mask_k_stack(trace_call) trace_call
131#else
132 #define sys_port_trace_type_mask_k_stack(trace_call)
133#endif
134
135#if defined(CONFIG_TRACING_MESSAGE_QUEUE)
136 #define sys_port_trace_type_mask_k_msgq(trace_call) trace_call
137#else
138 #define sys_port_trace_type_mask_k_msgq(trace_call)
139#endif
140
141#if defined(CONFIG_TRACING_MAILBOX)
142 #define sys_port_trace_type_mask_k_mbox(trace_call) trace_call
143#else
144 #define sys_port_trace_type_mask_k_mbox(trace_call)
145#endif
146
147#if defined(CONFIG_TRACING_PIPE)
148 #define sys_port_trace_type_mask_k_pipe(trace_call) trace_call
149#else
150 #define sys_port_trace_type_mask_k_pipe(trace_call)
151#endif
152
153#if defined(CONFIG_TRACING_HEAP)
154 #define sys_port_trace_type_mask_k_heap(trace_call) trace_call
155 #define sys_port_trace_type_mask_k_heap_sys(trace_call) trace_call
156#else
157 #define sys_port_trace_type_mask_k_heap(trace_call)
158 #define sys_port_trace_type_mask_k_heap_sys(trace_call)
159#endif
160
161#if defined(CONFIG_TRACING_MEMORY_SLAB)
162 #define sys_port_trace_type_mask_k_mem_slab(trace_call) trace_call
163#else
164 #define sys_port_trace_type_mask_k_mem_slab(trace_call)
165#endif
166
167#if defined(CONFIG_TRACING_TIMER)
168 #define sys_port_trace_type_mask_k_timer(trace_call) trace_call
169#else
170 #define sys_port_trace_type_mask_k_timer(trace_call)
171#endif
172
173#if defined(CONFIG_TRACING_EVENT)
174 #define sys_port_trace_type_mask_k_event(trace_call) trace_call
175#else
176 #define sys_port_trace_type_mask_k_event(trace_call)
177#endif
178
179#ifndef CONFIG_TRACING_POLLING
180 #define sys_port_trace_k_poll_api_is_disabled 1
181 #define sys_port_trace_k_work_poll_is_disabled 1
182#endif
183
184#ifndef CONFIG_TRACING_PM
185 #define sys_port_trace_pm_is_disabled 1
186#endif
187
188#if defined(CONFIG_TRACING_NET_SOCKETS)
189 #define sys_port_trace_type_mask_socket(trace_call) trace_call
190#else
191 #define sys_port_trace_type_mask_socket(trace_call)
192#endif
193
194#if defined(CONFIG_TRACING_NET_CORE)
195 #define sys_port_trace_type_mask_net(trace_call) trace_call
196#else
197 #define sys_port_trace_type_mask_net(trace_call)
198#endif
199
200/*
201 * We cannot positively enumerate all traced APIs, as applications may trace
202 * arbitrary custom APIs we know nothing about. Therefore we demand that tracing
203 * of an API must be actively disabled.
204 *
205 * This contrasts with object tracing/tracking as all traceable objects are well
206 * known, see the SYS_PORT_TRACING_TYPE_MASK approach below.
207 */
208#define _SYS_PORT_TRACE_IS_DISABLED(type) sys_port_trace_##type##_is_disabled
209#define _SYS_PORT_TRACE_WRAP(func, ...) do { func(__VA_ARGS__); } while (false)
210#define _SYS_PORT_TRACE_IF_NOT_DISABLED(type, func, ...) \
211 COND_CODE_1(_SYS_PORT_TRACE_IS_DISABLED(type), (), \
212 (_SYS_PORT_TRACE_WRAP(func, __VA_ARGS__)))
213
222#define SYS_PORT_TRACING_TYPE_MASK(type, trace_call) \
223 _SYS_PORT_TRACING_TYPE_MASK(type)(trace_call)
224
235#define SYS_PORT_TRACING_FUNC(type, func, ...) \
236 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC(type, func), __VA_ARGS__)
237
248#define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...) \
249 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_ENTER(type, func), __VA_ARGS__)
250
260#define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...) \
261 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_BLOCKING(type, func), \
262 __VA_ARGS__)
263
274#define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...) \
275 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_EXIT(type, func), __VA_ARGS__)
276
283#define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) \
284 do { \
285 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
286 _SYS_PORT_TRACING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
287 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
288 _SYS_PORT_TRACKING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
289 } while (false)
290
301#define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) \
302 do { \
303 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
304 _SYS_PORT_TRACING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
305 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
306 _SYS_PORT_TRACKING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
307 } while (false)
308
320#define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) \
321 do { \
322 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
323 _SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func)(obj, ##__VA_ARGS__)); \
324 } while (false)
325
337#define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, timeout, ...) \
338 do { \
339 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
340 _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func) \
341 (obj, timeout, ##__VA_ARGS__)); \
342 } while (false)
343
355#define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) \
356 do { \
357 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
358 _SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func)(obj, ##__VA_ARGS__)); \
359 } while (false)
360
366#define SYS_PORT_TRACING_TRACKING_FIELD(type) \
367 SYS_PORT_TRACING_TYPE_MASK(type, struct type *_obj_track_next;)
368
/* end of subsys_tracing_macros */
370
371#endif /* CONFIG_TRACING */
372
373#endif /* ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_ */
Macro utilities.