xref: /OK3568_Linux_fs/external/mpp/osal/mpp_trace.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2021 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define MODULE_TAG "mpp_trace"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include <fcntl.h>
20*4882a593Smuzhiyun #include <stdarg.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include "mpp_common.h"
23*4882a593Smuzhiyun #include "mpp_trace.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define ATRACE_MESSAGE_LENGTH 256
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun class MppTraceService
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun private:
30*4882a593Smuzhiyun     // avoid any unwanted function
31*4882a593Smuzhiyun     MppTraceService();
32*4882a593Smuzhiyun     ~MppTraceService();
33*4882a593Smuzhiyun     MppTraceService(const MppTraceService &);
34*4882a593Smuzhiyun     MppTraceService &operator=(const MppTraceService &);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun     void trace_write(const char *fmt, ...);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun     RK_S32 mTraceFd;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun public:
get_inst()41*4882a593Smuzhiyun     static MppTraceService *get_inst() {
42*4882a593Smuzhiyun         static MppTraceService inst;
43*4882a593Smuzhiyun         return &inst;
44*4882a593Smuzhiyun     }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun     void trace_begin(const char* name);
47*4882a593Smuzhiyun     void trace_end(const char* name);
48*4882a593Smuzhiyun     void trace_async_begin(const char* name, RK_S32 cookie);
49*4882a593Smuzhiyun     void trace_async_end(const char* name, RK_S32 cookie);
50*4882a593Smuzhiyun     void trace_int32(const char* name, RK_S32 val);
51*4882a593Smuzhiyun     void trace_int64(const char* name, RK_S64 val);
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
MppTraceService()54*4882a593Smuzhiyun MppTraceService::MppTraceService()
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun     static const char *ftrace_paths[] = {
57*4882a593Smuzhiyun         "/sys/kernel/debug/tracing/trace_marker",
58*4882a593Smuzhiyun         "/debug/tracing/trace_marker",
59*4882a593Smuzhiyun         "/debugfs/tracing/trace_marker",
60*4882a593Smuzhiyun     };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun     RK_U32 i;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun     for (i = 0; i < MPP_ARRAY_ELEMS(ftrace_paths); i++) {
65*4882a593Smuzhiyun         if (!access(ftrace_paths[i], F_OK)) {
66*4882a593Smuzhiyun             mTraceFd = open(ftrace_paths[i], O_WRONLY | O_CLOEXEC);
67*4882a593Smuzhiyun             if (mTraceFd >= 0)
68*4882a593Smuzhiyun                 break;
69*4882a593Smuzhiyun         }
70*4882a593Smuzhiyun     }
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun 
~MppTraceService()73*4882a593Smuzhiyun MppTraceService::~MppTraceService()
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun     if (mTraceFd >= 0) {
76*4882a593Smuzhiyun         close(mTraceFd);
77*4882a593Smuzhiyun         mTraceFd = -1;
78*4882a593Smuzhiyun     }
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
trace_write(const char * fmt,...)81*4882a593Smuzhiyun void MppTraceService::trace_write(const char *fmt, ...)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun     char buf[ATRACE_MESSAGE_LENGTH];
84*4882a593Smuzhiyun     va_list ap;
85*4882a593Smuzhiyun     RK_S32 len;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     va_start(ap, fmt);
88*4882a593Smuzhiyun     len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
89*4882a593Smuzhiyun     va_end(ap);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     (void)!write(mTraceFd, buf, len);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
trace_begin(const char * name)94*4882a593Smuzhiyun void MppTraceService::trace_begin(const char* name)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun     if (mTraceFd < 0)
97*4882a593Smuzhiyun         return;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun     trace_write("B|%d|%s", getpid(), name);
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
trace_end(const char * name)102*4882a593Smuzhiyun void MppTraceService::trace_end(const char* name)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun     if (mTraceFd < 0)
105*4882a593Smuzhiyun         return;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun     trace_write("E|%d|%s", getpid(), name);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
trace_async_begin(const char * name,RK_S32 cookie)110*4882a593Smuzhiyun void MppTraceService::trace_async_begin(const char* name, RK_S32 cookie)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun     if (mTraceFd < 0)
113*4882a593Smuzhiyun         return;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun     trace_write("S|%d|%s|%d", getpid(), name, cookie);
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
trace_async_end(const char * name,RK_S32 cookie)118*4882a593Smuzhiyun void MppTraceService::trace_async_end(const char* name, RK_S32 cookie)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun     if (mTraceFd < 0)
121*4882a593Smuzhiyun         return;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     trace_write("F|%d|%s|%d", getpid(), name, cookie);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
trace_int32(const char * name,RK_S32 value)126*4882a593Smuzhiyun void MppTraceService::trace_int32(const char* name, RK_S32 value)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun     if (mTraceFd < 0)
129*4882a593Smuzhiyun         return;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     trace_write("C|%d|%s|%d", getpid(), name, value);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
trace_int64(const char * name,RK_S64 value)134*4882a593Smuzhiyun void MppTraceService::trace_int64(const char* name, RK_S64 value)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun     if (mTraceFd < 0)
137*4882a593Smuzhiyun         return;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun     trace_write("C|%d|%s|%lld", getpid(), name, value);
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
mpp_trace_begin(const char * name)142*4882a593Smuzhiyun void mpp_trace_begin(const char* name)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_begin(name);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun 
mpp_trace_end(const char * name)147*4882a593Smuzhiyun void mpp_trace_end(const char* name)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_end(name);
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
mpp_trace_async_begin(const char * name,RK_S32 cookie)152*4882a593Smuzhiyun void mpp_trace_async_begin(const char* name, RK_S32 cookie)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_async_begin(name, cookie);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
mpp_trace_async_end(const char * name,RK_S32 cookie)157*4882a593Smuzhiyun void mpp_trace_async_end(const char* name, RK_S32 cookie)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_async_end(name, cookie);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
mpp_trace_int32(const char * name,RK_S32 value)162*4882a593Smuzhiyun void mpp_trace_int32(const char* name, RK_S32 value)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_int32(name, value);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
mpp_trace_int64(const char * name,RK_S64 value)167*4882a593Smuzhiyun void mpp_trace_int64(const char* name, RK_S64 value)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun     MppTraceService::get_inst()->trace_int64(name, value);
170*4882a593Smuzhiyun }
171