VSF Documented
vsf_trace.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_TRACE_H__
19#define __VSF_TRACE_H__
20
21/*============================ INCLUDES ======================================*/
22
24
25// for SECTION
27
28#if defined(__VSF_TRACE_CLASS_IMPLEMENT)
29# define __VSF_CLASS_IMPLEMENT__
30#elif defined(__VSF_TRACE_CLASS_INHERIT__)
31# define __VSF_CLASS_INHERIT__
32#endif
33
34#include "utilities/ooc_class.h"
35
36#if VSF_USE_TRACE == ENABLED
37# include <stdarg.h>
38#endif
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44/*============================ MACROS ========================================*/
45
46#ifndef VSF_TRACE_CFG_LINEEND
47# define VSF_TRACE_CFG_LINEEND "\r\n"
48#endif
49
50#ifndef VSF_TRACE_CFG_DEFAULT_LEVEL
51# define VSF_TRACE_CFG_DEFAULT_LEVEL VSF_TRACE_INFO
52#endif
53
54// display flag
55#define VSF_TRACE_DF_DS(n) (((n) & 0xFF) << 0) // data size
56#define VSF_TRACE_DF_DPL(n) (((n) & 0xFF) << 8) // data per line
57#define VSF_TRACE_DF_ADDR (1UL << 16) // display address
58#define VSF_TRACE_DF_CHAR (1UL << 17) // display character
59#define VSF_TRACE_DF_NEWLINE (1UL << 18) // append newline
60
61#define VSF_TRACE_DF_U8_16 (VSF_TRACE_DF_DS(1) | VSF_TRACE_DF_DPL(16))
62#define VSF_TRACE_DF_U8_16_A (VSF_TRACE_DF_U8_16 | VSF_TRACE_DF_ADDR)
63#define VSF_TRACE_DF_U8_16_AC (VSF_TRACE_DF_U8_16_A | VSF_TRACE_DF_CHAR)
64#define VSF_TRACE_DF_U8_16_ACN (VSF_TRACE_DF_U8_16_AC | VSF_TRACE_DF_NEWLINE)
65#define VSF_TRACE_DF_U8_16_AN (VSF_TRACE_DF_U8_16_A | VSF_TRACE_DF_NEWLINE)
66#define VSF_TRACE_DF_U8_16_N (VSF_TRACE_DF_U8_16 | VSF_TRACE_DF_NEWLINE)
67
68#ifndef VSF_TRACE_DF_DEFAULT
69# define VSF_TRACE_DF_DEFAULT VSF_TRACE_DF_U8_16_ACN
70#endif
71
72// TODO: fix VSF_TRACE_POINTER_HEX with arch configuration if %p is not supported
73#define VSF_TRACE_POINTER_HEX "%p"
74
75/*============================ MACROFIED FUNCTIONS ===========================*/
76
77#define vsf_trace_print_mem vsf_trace_buffer
78
79#if VSF_USE_TRACE == ENABLED
80# if VSF_USE_SIMPLE_STREAM == ENABLED
82# define vsf_trace_init(__stream) __vsf_trace_init((vsf_stream_t *)(__stream))
83# elif VSF_USE_STREAM == ENABLED
84typedef struct vsf_stream_tx_t vsf_stream_tx_t;
85# define vsf_trace_init(__stream) __vsf_trace_init((vsf_stream_tx_t *)(__stream))
86# endif
87#endif
88
89#define vsf_trace_info(...) vsf_trace(VSF_TRACE_INFO, __VA_ARGS__)
90#define vsf_trace_warning(...) vsf_trace(VSF_TRACE_WARNING, __VA_ARGS__)
91#define vsf_trace_error(...) vsf_trace(VSF_TRACE_ERROR, __VA_ARGS__)
92#define vsf_trace_debug(...) vsf_trace(VSF_TRACE_DEBUG, __VA_ARGS__)
93
94// background trace
95
96#define __vsf_bgtrace_type(__name) __name##_bgtrace_t
97#define vsf_bgtrace_type(__name) __vsf_bgtrace_type(__name)
98#define __vsf_bgtrace_etype(__name) __name##_bgtrace_ele_t
99#define vsf_bgtrace_etype(__name) __vsf_bgtrace_etype(__name)
100
101#define __declare_bgtrace(__name) vsf_dcl_class(vsf_bgtrace_type(__name))
102#define __define_bgtrace(__name, __ele_num, ...) \
103 typedef struct vsf_bgtrace_etype(__name) { \
104 __VA_ARGS__ \
105 } vsf_bgtrace_etype(__name); \
106 vsf_class(vsf_bgtrace_type(__name)) { \
107 public_member( \
108 implement(vsf_bgtrace_t) \
109 vsf_bgtrace_etype(__name) __elements[__ele_num]; \
110 ) \
111 };
112
113#define declare_bgtrace(__name) __declare_bgtrace(__name)
114#define dcl_bgtrace(__name) declare_bgtrace(__name)
115
116#define define_bgtrace(__name, __ele_num, ...) \
117 __define_bgtrace(__name, (__ele_num), __VA_ARGS__)
118#define def_bgtrace(__name, __ele_num, ...) \
119 define_bgtrace(__name, (__ele_num), __VA_ARGS__)
120
121#define __describe_bgtrace(__name, __ele_num, __print_element, ...) \
122 declare_bgtrace(__name) \
123 define_bgtrace(__name, (__ele_num), __VA_ARGS__) \
124 vsf_bgtrace_type(__name) __name = { \
125 .ele_num = (__ele_num), \
126 .ele_size = sizeof(vsf_bgtrace_etype(__name)), \
127 .elements = (void *)__name.__elements, \
128 .print_element = (void (*)(uint16_t pos, void *element))(__print_element),\
129 };
130
131#define describe_bgtrace(__name, __ele_num, __print_element, ...) \
132 __describe_bgtrace(__name, (__ele_num), (__print_element), __VA_ARGS__)
133
134/*============================ TYPES =========================================*/
135
136typedef enum vsf_trace_level_t {
144
146 public_member(
147 uint16_t ele_num, ele_size;
148 void *elements;
149 void (*print_element)(uint16_t pos, void *element);
151
152 private_member(
153 uint16_t pos, num;
154 uint32_t total;
155 )
156};
157
158/*============================ GLOBAL VARIABLES ==============================*/
159/*============================ PROTOTYPES ====================================*/
160
161#if VSF_USE_TRACE == ENABLED
162
163# if VSF_USE_SIMPLE_STREAM == ENABLED
164extern void __vsf_trace_init(vsf_stream_t *stream);
165# elif VSF_USE_STREAM == ENABLED
166extern void __vsf_trace_init(vsf_stream_tx_t *ptTX);
167# endif
168extern void vsf_trace_fini(void);
169
170#define __vsf_trace_buffer3(__level, __buffer, __len) \
171 __vsf_trace_buffer((__level), (__buffer), (__len), VSF_TRACE_DF_DEFAULT)
172#define __vsf_trace_buffer4(__level, __buffer, __len, __flag) \
173 __vsf_trace_buffer((__level), (__buffer), (__len), (__flag))
174// prototype
175// vsf_trace_buffer(__level, __buffer, __len) // use VSF_TRACE_DF_DEFAULT
176// vsf_trace_buffer(__level, __buffer, __len, __flag) // use flag
177#define vsf_trace_buffer(__level, __buffer, __len, ...) \
178 __PLOOC_EVAL(__vsf_trace_buffer, (__level), (__buffer), (__len), ##__VA_ARGS__)\
179 ((__level), (__buffer), (__len), ##__VA_ARGS__)
180
181#if VSF_APPLET_USE_TRACE == ENABLED
182typedef struct vsf_trace_vplt_t {
184
192# ifndef __VSF_APPLET__
194# endif
195#endif
196
197#if defined(__VSF_APPLET__) && (defined(__VSF_APPLET_LIB__) || defined(__VSF_APPLET_TRACE_LIB__))\
198 && VSF_APPLET_CFG_ABI_PATCH != ENABLED && VSF_APPLET_USE_TRACE == ENABLED
199
200# define VSF_APPLET_TRACE_VPLT \
201 ((vsf_trace_vplt_t *)(VSF_SERVICE_APPLET_VPLT->trace_vplt))
202
203#define VSF_APPLET_TRACE_ENTRY(__NAME) \
204 VSF_APPLET_VPLT_ENTRY_FUNC_ENTRY(VSF_APPLET_TRACE_VPLT, __NAME)
205#define VSF_APPLET_TRACE_IMP(...) \
206 VSF_APPLET_VPLT_ENTRY_FUNC_IMP(VSF_APPLET_TRACE_VPLT, __VA_ARGS__)
207
208VSF_APPLET_TRACE_IMP(__vsf_trace_buffer, void, vsf_trace_level_t level, void *buffer, uint_fast16_t len, uint_fast32_t flag) {
209 VSF_APPLET_TRACE_ENTRY(__vsf_trace_buffer)(level, buffer, len, flag);
210}
211VSF_APPLET_TRACE_IMP(vsf_trace_string, void, vsf_trace_level_t level, const char *str) {
212 VSF_APPLET_TRACE_ENTRY(vsf_trace_string)(level, str);
213}
214VSF_APPLET_TRACE_IMP(vsf_trace_arg, void, vsf_trace_level_t level, const char *format, va_list arg) {
215 VSF_APPLET_TRACE_ENTRY(vsf_trace_arg)(level, format, arg);
216}
217VSF_APPLET_TRACE_IMP(__vsf_trace_output, uint_fast32_t, const char *buff, uint_fast32_t size) {
218 return VSF_APPLET_TRACE_ENTRY(__vsf_trace_output)(buff, size);
219}
220VSF_APPLET_TRACE_IMP(vsf_trace_assert, void, const char *expr, const char *file, int line, const char *func) {
221 VSF_APPLET_TRACE_ENTRY(vsf_trace_assert)(expr, file, line, func);
222}
223
225 va_list ap;
226
227 va_start(ap, format);
228 vsf_trace_arg(level, format, ap);
229 va_end(ap);
230}
231
232#else
233
234VSF_CAL_SECTION(".text.vsf.trace.__vsf_trace_buffer")
235extern void __vsf_trace_buffer( vsf_trace_level_t level,
236 void *buffer,
237 uint_fast16_t len,
238 uint_fast32_t flag);
239
240extern void vsf_trace_string(vsf_trace_level_t level, const char *str);
241extern void vsf_trace_arg(vsf_trace_level_t level, const char *format, va_list arg);
242extern void vsf_trace(vsf_trace_level_t level, const char *format, ...);
243
245extern void vsf_trace_assert(const char *expr, const char *file, int line, const char *func);
246extern void vsf_trace_dump_stack(void);
247
248#endif
249
250// bgtrace
251
252extern void vsf_bgtrace_clear(vsf_bgtrace_t *bgtrace);
254extern void vsf_bgtrace_append(vsf_bgtrace_t *bgtrace, void *element);
255extern void vsf_bgtrace_print(vsf_bgtrace_t *bgtrace, int cnt);
256
257#else
258# if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
259# define vsf_trace_init(__arg)
260# define vsf_trace_fini(__arg)
261# define vsf_trace(__arg)
262# define vsf_trace_buffer(__arg)
263# define vsf_trace_string(__arg)
264# define vsf_bgtrace_clear(__arg)
265# define vsf_bgtrace_total(__arg)
266# define vsf_bgtrace_append(__arg)
267# define vsf_bgtrace_print(__arg)
268# else
269# define vsf_trace_init(...)
270# define vsf_trace_fini(...)
271# define vsf_trace(...)
272# define vsf_trace_buffer(...)
273# define vsf_trace_string(...)
274# define vsf_bgtrace_clear(...)
275# define vsf_bgtrace_total(...)
276# define vsf_bgtrace_append(...)
277# define vsf_bgtrace_print(...)
278# endif
279#endif
280
281#ifdef __cplusplus
282}
283#endif
284
285#endif // __VSF_TRACE_H__
#define VSF_CAL_SECTION(__SEC)
Definition __compiler.h:181
Definition vsf_trace.h:145
Definition vsf_simple_stream.h:254
struct vsf_stream_tx_t vsf_stream_tx_t
Definition interface.h:34
#define vsf_class(__name)
Definition ooc_class.h:48
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned short uint_fast16_t
Definition stdint.h:25
Definition vsf_trace.h:182
vsf_vplt_info_t info
Definition vsf_trace.h:183
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__vsf_trace_output)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__vsf_trace_buffer)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_trace_assert)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_trace)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_trace_string)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_trace_arg)
Definition vsf_cfg.h:95
#define __VSF_VPLT_DECORATOR__
Definition vsf_cfg.h:93
#define VSF_APPLET_VPLT_FUNC_DECORATOR(__NAME)
Definition vsf_linux_applet_lib.c:1
uint8_t * buff
Definition vsf_memfs.h:51
uint32_t size
Definition vsf_memfs.h:50
SDL_PixelFormat format
Definition vsf_sdl2_pixelformat.c:32
void vsf_bgtrace_clear(vsf_bgtrace_t *bgtrace)
Definition vsf_trace.c:411
uint_fast32_t __vsf_trace_output(const char *buff, uint_fast32_t size)
Definition vsf_trace.c:106
void __vsf_trace_buffer(vsf_trace_level_t level, void *buffer, uint_fast16_t len, uint_fast32_t flag)
Definition vsf_trace.c:248
void vsf_trace_dump_stack(void)
Definition vsf_trace.c:359
void vsf_bgtrace_append(vsf_bgtrace_t *bgtrace, void *element)
Definition vsf_trace.c:421
void vsf_trace_fini(void)
Definition vsf_trace.c:136
void vsf_trace_assert(const char *expr, const char *file, int line, const char *func)
Definition vsf_trace.c:387
void vsf_trace_arg(vsf_trace_level_t level, const char *format, va_list arg)
Definition vsf_trace.c:340
__VSF_VPLT_DECORATOR__ vsf_trace_vplt_t vsf_trace_vplt
Definition vsf_trace.c:397
void vsf_trace(vsf_trace_level_t level, const char *format,...)
Definition vsf_trace.c:347
vsf_trace_level_t
Definition vsf_trace.h:136
@ VSF_TRACE_DEBUG
Definition vsf_trace.h:141
@ VSF_TRACE_WARNING
Definition vsf_trace.h:140
@ VSF_TRACE_ERROR
Definition vsf_trace.h:138
@ VSF_TRACE_LEVEL_NUM
Definition vsf_trace.h:142
@ VSF_TRACE_NONE
Definition vsf_trace.h:137
@ VSF_TRACE_INFO
Definition vsf_trace.h:139
void vsf_trace_string(vsf_trace_level_t level, const char *str)
Definition vsf_trace.c:240
uint32_t vsf_bgtrace_total(vsf_bgtrace_t *bgtrace)
Definition vsf_trace.c:416
void vsf_bgtrace_print(vsf_bgtrace_t *bgtrace, int cnt)
Definition vsf_trace.c:438
void __vsf_trace_init(vsf_stream_t *stream)
Definition vsf_trace.c:118