Zephyr API Documentation 4.3.0-rc2
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
14
16
17#if !defined(CONFIG_TRACING) && !defined(__DOXYGEN__)
18
19#define SYS_PORT_TRACING_FUNC(type, func, ...) do { } while (false)
20#define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...) do { } while (false)
21#define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...) do { } while (false)
22#define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...) do { } while (false)
23#define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) do { } while (false)
24#define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) do { } while (false)
25#define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) do { } while (false)
26#define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, ...) do { } while (false)
27#define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) do { } while (false)
28
29#define SYS_PORT_TRACING_TRACKING_FIELD(type)
30
31#else
32
42
44
45/*
46 * Helper macros used by the extended tracing system
47 */
48
49#define _SYS_PORT_TRACING_TYPE_MASK(type) \
50 sys_port_trace_type_mask_ ## type
51#define _SYS_PORT_TRACING_FUNC(name, func) \
52 sys_port_trace_ ## name ## _ ## func
53#define _SYS_PORT_TRACING_FUNC_ENTER(name, func) \
54 sys_port_trace_ ## name ## _ ## func ## _enter
55#define _SYS_PORT_TRACING_FUNC_BLOCKING(name, func) \
56 sys_port_trace_ ## name ## _ ## func ## _blocking
57#define _SYS_PORT_TRACING_FUNC_EXIT(name, func) \
58 sys_port_trace_ ## name ## _ ## func ## _exit
59#define _SYS_PORT_TRACING_OBJ_INIT(name) \
60 sys_port_trace_ ## name ## _init
61#define _SYS_PORT_TRACING_OBJ_FUNC(name, func) \
62 sys_port_trace_ ## name ## _ ## func
63#define _SYS_PORT_TRACING_OBJ_FUNC_ENTER(name, func) \
64 sys_port_trace_ ## name ## _ ## func ## _enter
65#define _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(name, func) \
66 sys_port_trace_ ## name ## _ ## func ## _blocking
67#define _SYS_PORT_TRACING_OBJ_FUNC_EXIT(name, func) \
68 sys_port_trace_ ## name ## _ ## func ## _exit
69
70/*
71 * Helper macros for the object tracking system
72 */
73
74#define _SYS_PORT_TRACKING_OBJ_INIT(name) \
75 sys_port_track_ ## name ## _init
76#define _SYS_PORT_TRACKING_OBJ_FUNC(name, func) \
77 sys_port_track_ ## name ## _ ## func
78
79/*
80 * Object trace macros part of the system for checking if certain
81 * objects should be traced or not depending on the tracing configuration.
82 */
83#if defined(CONFIG_TRACING_THREAD)
84 #define sys_port_trace_type_mask_k_thread(trace_call) trace_call
85#else
86 #define sys_port_trace_type_mask_k_thread(trace_call)
87 #define sys_port_trace_k_thread_is_disabled 1
88#endif
89
90#if defined(CONFIG_TRACING_WORK)
91 #define sys_port_trace_type_mask_k_work(trace_call) trace_call
92 #define sys_port_trace_type_mask_k_work_queue(trace_call) trace_call
93 #define sys_port_trace_type_mask_k_work_delayable(trace_call) trace_call
94 #define sys_port_trace_type_mask_k_work_poll(trace_call) trace_call
95#else
96 #define sys_port_trace_type_mask_k_work(trace_call)
97 #define sys_port_trace_type_mask_k_work_queue(trace_call)
98 #define sys_port_trace_type_mask_k_work_delayable(trace_call)
99 #define sys_port_trace_type_mask_k_work_poll(trace_call)
100#endif
101
102#if defined(CONFIG_TRACING_SEMAPHORE)
103 #define sys_port_trace_type_mask_k_sem(trace_call) trace_call
104#else
105 #define sys_port_trace_type_mask_k_sem(trace_call)
106#endif
107
108#if defined(CONFIG_TRACING_MUTEX)
109 #define sys_port_trace_type_mask_k_mutex(trace_call) trace_call
110#else
111 #define sys_port_trace_type_mask_k_mutex(trace_call)
112#endif
113
114#if defined(CONFIG_TRACING_CONDVAR)
115 #define sys_port_trace_type_mask_k_condvar(trace_call) trace_call
116#else
117 #define sys_port_trace_type_mask_k_condvar(trace_call)
118#endif
119
120#if defined(CONFIG_TRACING_QUEUE)
121 #define sys_port_trace_type_mask_k_queue(trace_call) trace_call
122#else
123 #define sys_port_trace_type_mask_k_queue(trace_call)
124#endif
125
126#if defined(CONFIG_TRACING_FIFO)
127 #define sys_port_trace_type_mask_k_fifo(trace_call) trace_call
128#else
129 #define sys_port_trace_type_mask_k_fifo(trace_call)
130#endif
131
132#if defined(CONFIG_TRACING_LIFO)
133 #define sys_port_trace_type_mask_k_lifo(trace_call) trace_call
134#else
135 #define sys_port_trace_type_mask_k_lifo(trace_call)
136#endif
137
138#if defined(CONFIG_TRACING_STACK)
139 #define sys_port_trace_type_mask_k_stack(trace_call) trace_call
140#else
141 #define sys_port_trace_type_mask_k_stack(trace_call)
142#endif
143
144#if defined(CONFIG_TRACING_MESSAGE_QUEUE)
145 #define sys_port_trace_type_mask_k_msgq(trace_call) trace_call
146#else
147 #define sys_port_trace_type_mask_k_msgq(trace_call)
148#endif
149
150#if defined(CONFIG_TRACING_MAILBOX)
151 #define sys_port_trace_type_mask_k_mbox(trace_call) trace_call
152#else
153 #define sys_port_trace_type_mask_k_mbox(trace_call)
154#endif
155
156#if defined(CONFIG_TRACING_PIPE)
157 #define sys_port_trace_type_mask_k_pipe(trace_call) trace_call
158#else
159 #define sys_port_trace_type_mask_k_pipe(trace_call)
160#endif
161
162#if defined(CONFIG_TRACING_HEAP)
163 #define sys_port_trace_type_mask_k_heap(trace_call) trace_call
164 #define sys_port_trace_type_mask_k_heap_sys(trace_call) trace_call
165#else
166 #define sys_port_trace_type_mask_k_heap(trace_call)
167 #define sys_port_trace_type_mask_k_heap_sys(trace_call)
168#endif
169
170#if defined(CONFIG_TRACING_MEMORY_SLAB)
171 #define sys_port_trace_type_mask_k_mem_slab(trace_call) trace_call
172#else
173 #define sys_port_trace_type_mask_k_mem_slab(trace_call)
174#endif
175
176#if defined(CONFIG_TRACING_TIMER)
177 #define sys_port_trace_type_mask_k_timer(trace_call) trace_call
178#else
179 #define sys_port_trace_type_mask_k_timer(trace_call)
180#endif
181
182#if defined(CONFIG_TRACING_EVENT)
183 #define sys_port_trace_type_mask_k_event(trace_call) trace_call
184#else
185 #define sys_port_trace_type_mask_k_event(trace_call)
186#endif
187
188#ifndef CONFIG_TRACING_POLLING
189 #define sys_port_trace_k_poll_api_is_disabled 1
190 #define sys_port_trace_k_work_poll_is_disabled 1
191#endif
192
193#ifndef CONFIG_TRACING_PM
194 #define sys_port_trace_pm_is_disabled 1
195#endif
196
197#if defined(CONFIG_TRACING_NET_SOCKETS)
198 #define sys_port_trace_type_mask_socket(trace_call) trace_call
199#else
200 #define sys_port_trace_type_mask_socket(trace_call)
201#endif
202
203#if defined(CONFIG_TRACING_NET_CORE)
204 #define sys_port_trace_type_mask_net(trace_call) trace_call
205#else
206 #define sys_port_trace_type_mask_net(trace_call)
207#endif
208
209/*
210 * We cannot positively enumerate all traced APIs, as applications may trace
211 * arbitrary custom APIs we know nothing about. Therefore we demand that tracing
212 * of an API must be actively disabled.
213 *
214 * This contrasts with object tracing/tracking as all traceable objects are well
215 * known, see the SYS_PORT_TRACING_TYPE_MASK approach below.
216 */
217#define _SYS_PORT_TRACE_IS_DISABLED(type) sys_port_trace_##type##_is_disabled
218#define _SYS_PORT_TRACE_WRAP(func, ...) do { func(__VA_ARGS__); } while (false)
219#define _SYS_PORT_TRACE_IF_NOT_DISABLED(type, func, ...) \
220 COND_CODE_1(_SYS_PORT_TRACE_IS_DISABLED(type), (), \
221 (_SYS_PORT_TRACE_WRAP(func, __VA_ARGS__)))
222
224
231#define SYS_PORT_TRACING_TYPE_MASK(type, trace_call) \
232 _SYS_PORT_TRACING_TYPE_MASK(type)(trace_call)
233
244#define SYS_PORT_TRACING_FUNC(type, func, ...) \
245 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC(type, func), __VA_ARGS__)
246
257#define SYS_PORT_TRACING_FUNC_ENTER(type, func, ...) \
258 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_ENTER(type, func), __VA_ARGS__)
259
269#define SYS_PORT_TRACING_FUNC_BLOCKING(type, func, ...) \
270 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_BLOCKING(type, func), \
271 __VA_ARGS__)
272
283#define SYS_PORT_TRACING_FUNC_EXIT(type, func, ...) \
284 _SYS_PORT_TRACE_IF_NOT_DISABLED(type, _SYS_PORT_TRACING_FUNC_EXIT(type, func), __VA_ARGS__)
285
292#define SYS_PORT_TRACING_OBJ_INIT(obj_type, obj, ...) \
293 do { \
294 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
295 _SYS_PORT_TRACING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
296 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
297 _SYS_PORT_TRACKING_OBJ_INIT(obj_type)(obj, ##__VA_ARGS__)); \
298 } while (false)
299
310#define SYS_PORT_TRACING_OBJ_FUNC(obj_type, func, obj, ...) \
311 do { \
312 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
313 _SYS_PORT_TRACING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
314 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
315 _SYS_PORT_TRACKING_OBJ_FUNC(obj_type, func)(obj, ##__VA_ARGS__)); \
316 } while (false)
317
329#define SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func, obj, ...) \
330 do { \
331 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
332 _SYS_PORT_TRACING_OBJ_FUNC_ENTER(obj_type, func)(obj, ##__VA_ARGS__)); \
333 } while (false)
334
346#define SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func, obj, timeout, ...) \
347 do { \
348 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
349 _SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(obj_type, func) \
350 (obj, timeout, ##__VA_ARGS__)); \
351 } while (false)
352
364#define SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func, obj, ...) \
365 do { \
366 SYS_PORT_TRACING_TYPE_MASK(obj_type, \
367 _SYS_PORT_TRACING_OBJ_FUNC_EXIT(obj_type, func)(obj, ##__VA_ARGS__)); \
368 } while (false)
369
375#define SYS_PORT_TRACING_TRACKING_FIELD(type) \
376 SYS_PORT_TRACING_TYPE_MASK(type, struct type *_obj_track_next;)
377 /* end of subsys_tracing_macros */
379
380#endif /* CONFIG_TRACING */
381
382#endif /* ZEPHYR_INCLUDE_TRACING_TRACING_MACROS_H_ */
Macro utilities.