xref: /OK3568_Linux_fs/app/lvgl_demo/sys/trace.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "trace.h"
2*4882a593Smuzhiyun #include <sys/types.h>
3*4882a593Smuzhiyun #include <sys/stat.h>
4*4882a593Smuzhiyun #include <fcntl.h>
5*4882a593Smuzhiyun #include <unistd.h>
6*4882a593Smuzhiyun #include <stdlib.h>
7*4882a593Smuzhiyun #include <stdio.h>
8*4882a593Smuzhiyun #include <errno.h>
9*4882a593Smuzhiyun #include <inttypes.h>
10*4882a593Smuzhiyun #include <string.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define TRACE_ON
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifdef TRACE_ON
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #ifdef __cplusplus
17*4882a593Smuzhiyun #define CC_LIKELY( exp )    (__builtin_expect( !!(exp), true ))
18*4882a593Smuzhiyun #define CC_UNLIKELY( exp )  (__builtin_expect( !!(exp), false ))
19*4882a593Smuzhiyun #else
20*4882a593Smuzhiyun #define CC_LIKELY( exp )    (__builtin_expect( !!(exp), 1 ))
21*4882a593Smuzhiyun #define CC_UNLIKELY( exp )  (__builtin_expect( !!(exp), 0 ))
22*4882a593Smuzhiyun #endif
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define ATRACE_MESSAGE_LENGTH 1024
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static int atrace_marker_fd     = -1;
27*4882a593Smuzhiyun static int init_ok = 0;
28*4882a593Smuzhiyun 
trace_init_once(void)29*4882a593Smuzhiyun static int trace_init_once(void)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun     if (init_ok == 0)
32*4882a593Smuzhiyun     {
33*4882a593Smuzhiyun          atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY | O_CLOEXEC);
34*4882a593Smuzhiyun         if (atrace_marker_fd == -1) {
35*4882a593Smuzhiyun             printf("Error opening trace file: %s (%d)", strerror(errno), errno);
36*4882a593Smuzhiyun             return -1;
37*4882a593Smuzhiyun         }
38*4882a593Smuzhiyun     }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun     init_ok = 1;
41*4882a593Smuzhiyun     return 0;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define WRITE_MSG(format_begin, format_end, name, value) { \
45*4882a593Smuzhiyun     char buf[ATRACE_MESSAGE_LENGTH]; \
46*4882a593Smuzhiyun     if (CC_UNLIKELY(!init_ok)) \
47*4882a593Smuzhiyun         trace_init_once(); \
48*4882a593Smuzhiyun     int pid = getpid(); \
49*4882a593Smuzhiyun     int len = snprintf(buf, sizeof(buf), format_begin "%s" format_end, pid, \
50*4882a593Smuzhiyun         name, value); \
51*4882a593Smuzhiyun     if (len >= (int) sizeof(buf)) { \
52*4882a593Smuzhiyun         /* Given the sizeof(buf), and all of the current format buffers, \
53*4882a593Smuzhiyun          * it is impossible for name_len to be < 0 if len >= sizeof(buf). */ \
54*4882a593Smuzhiyun         int name_len = strlen(name) - (len - sizeof(buf)) - 1; \
55*4882a593Smuzhiyun         /* Truncate the name to make the message fit. */ \
56*4882a593Smuzhiyun         printf("Truncated name in %s: %s\n", __FUNCTION__, name); \
57*4882a593Smuzhiyun         len = snprintf(buf, sizeof(buf), format_begin "%.*s" format_end, pid, \
58*4882a593Smuzhiyun             name_len, name, value); \
59*4882a593Smuzhiyun     } \
60*4882a593Smuzhiyun     if (write(atrace_marker_fd, buf, len) != len) \
61*4882a593Smuzhiyun         printf("Warning: write failed\n"); \
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
atrace_begin_body(const char * name)64*4882a593Smuzhiyun void atrace_begin_body(const char* name)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun     WRITE_MSG("B|%d|", "%s", name, "");
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
atrace_end_body()69*4882a593Smuzhiyun void atrace_end_body()
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     WRITE_MSG("E|%d", "%s", "", "");
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
atrace_async_begin_body(const char * name,int32_t cookie)74*4882a593Smuzhiyun void atrace_async_begin_body(const char* name, int32_t cookie)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun     WRITE_MSG("S|%d|", "|%" PRId32, name, cookie);
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
atrace_async_end_body(const char * name,int32_t cookie)79*4882a593Smuzhiyun void atrace_async_end_body(const char* name, int32_t cookie)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun     WRITE_MSG("F|%d|", "|%" PRId32, name, cookie);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
atrace_int_body(const char * name,int32_t value)84*4882a593Smuzhiyun void atrace_int_body(const char* name, int32_t value)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun     WRITE_MSG("C|%d|", "|%" PRId32, name, value);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
atrace_int64_body(const char * name,int64_t value)89*4882a593Smuzhiyun void atrace_int64_body(const char* name, int64_t value)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun     WRITE_MSG("C|%d|", "|%" PRId64, name, value);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #else
95*4882a593Smuzhiyun 
atrace_begin_body(const char * name)96*4882a593Smuzhiyun void atrace_begin_body(__attribute__((unused)) const char* name)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
atrace_end_body()100*4882a593Smuzhiyun void atrace_end_body()
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
atrace_async_begin_body(const char * name,int32_t cookie)104*4882a593Smuzhiyun void atrace_async_begin_body(__attribute__((unused)) const char* name, __attribute__((unused)) int32_t cookie)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
atrace_async_end_body(const char * name,int32_t cookie)108*4882a593Smuzhiyun void atrace_async_end_body(__attribute__((unused)) const char* name, __attribute__((unused)) int32_t cookie)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
atrace_int_body(const char * name,int32_t value)112*4882a593Smuzhiyun void atrace_int_body(__attribute__((unused)) const char* name, __attribute__((unused)) int32_t value)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
atrace_int64_body(const char * name,int64_t value)116*4882a593Smuzhiyun void atrace_int64_body(__attribute__((unused)) const char* name, __attribute__((unused)) int64_t value)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #endif
121